const int TILE_W = 32; const int TILE_H = 32; // Rod 3D game script by James Bunting // weapon numbers int weapChainsaw; int weapPistol; int weapMachineGun; int weapRiotGun; int weapFlamer; int weapRiotCannon; int weapHeatSeeker; int weapEnergyCannon; int weapSuperMinigun; int weapGSX; int weapBlobPlasma; int weapWormPlasma; // object type numbers int objPlayer; int objBlob; int objWorm; int objMegaWorm; int objBabyWorm; int objChinook; int objAirFighter; int objBird; int objAttackHeli; // projectile type numbers int pSawGore; int pBullet; int pShot; int pEnergyPulse; int pFlames; int pRocket; int pBlobPlasma; int pWormPlasma; int pIon; // weapon sound numbers int sndChainsaw; int sndPistol; int sndMachineGun; int sndRiotGun; int sndFlamer; int sndHeatSeeker; int sndEnergyCannon; int sndGSX; int sndBlobPlasma; int sndWormPlasma; // contact sounds int sndContactRico; int sndContactBoom; int sndContactBeam; int sndContactClang; int sndContactBounce; // death sounds int sndPlayerDie; int sndBlobDie; int sndWormDie; int sndMegaWormDie; int sndBabyWormDie; int sndChinookDie; int sndAirFighterDie; int sndBirdDie; // other sound numbers int sndDoor; // sprite numbers int sprDustParticle; int sprFireParticle; int sprFlamerParticle; // ********************************************************************************************************************* void OnMapStart_Global() { /* It is much faster the access data by index numbers rather than having to look up these numbers from meaningful names constantly during the game. Therefore commonly used weapons, objects, projectiles, sounds and more are stored by index number below. */ // store weapon numbers (these names are defined in weapons.ini) weapChainsaw = SC_GetWeaponTypeNumber("Chainsaw"); weapPistol = SC_GetWeaponTypeNumber("Silenced Pistol"); weapMachineGun = SC_GetWeaponTypeNumber("Machine Gun"); weapRiotGun = SC_GetWeaponTypeNumber("Riot Gun"); weapFlamer = SC_GetWeaponTypeNumber("Flamer"); weapRiotCannon = SC_GetWeaponTypeNumber("Riot Cannon"); weapHeatSeeker = SC_GetWeaponTypeNumber("Heat Seeker"); weapEnergyCannon = SC_GetWeaponTypeNumber("PX Energy Cannon"); weapSuperMinigun = SC_GetWeaponTypeNumber("Super Minigun"); weapGSX = SC_GetWeaponTypeNumber("GSX Ion Discharge"); weapBlobPlasma = SC_GetWeaponTypeNumber("Blob Plasma"); weapWormPlasma = SC_GetWeaponTypeNumber("Worm Plasma"); // store object type numbers (these names are defined set in ObjectTypes.ini) objPlayer = SC_GetObjectTypeNumber("Player"); objBlob = SC_GetObjectTypeNumber("Green Blob"); objWorm = SC_GetObjectTypeNumber("Giant Worm"); objMegaWorm = SC_GetObjectTypeNumber("Mega Worm"); objBabyWorm = SC_GetObjectTypeNumber("Baby Worm"); objChinook = SC_GetObjectTypeNumber("Chinook"); objAirFighter = SC_GetObjectTypeNumber("Air Fighter"); objBird = SC_GetObjectTypeNumber("Bird"); objAttackHeli = SC_GetObjectTypeNumber("Attack Helicopter"); // store projectile type numbers (these names are defined set in projectiles.ini) pSawGore = SC_GetProjectileTypeNumber("Saw Gore"); pBullet = SC_GetProjectileTypeNumber("Bullet"); pShot = SC_GetProjectileTypeNumber("Shot"); pEnergyPulse = SC_GetProjectileTypeNumber("Energy Pulse"); pFlames = SC_GetProjectileTypeNumber("Flames"); pRocket = SC_GetProjectileTypeNumber("Rocket"); pBlobPlasma = SC_GetProjectileTypeNumber("Blob Plasma"); pWormPlasma = SC_GetProjectileTypeNumber("Worm Plasma"); pIon = SC_GetProjectileTypeNumber("Ion"); // store weapon fire sound numbers (sound names are the relative filenames of the sounds without file extensions AND number suffixes) sndChainsaw = SC_GetSoundNumber("weapons\\chainsaw"); sndPistol = SC_GetSoundNumber("weapons\\pistol"); sndMachineGun = SC_GetSoundNumber("weapons\\uzi"); sndRiotGun = SC_GetSoundNumber("weapons\\shot"); sndFlamer = SC_GetSoundNumber("weapons\\FireFire"); sndHeatSeeker = SC_GetSoundNumber("weapons\\Rocket"); sndEnergyCannon = SC_GetSoundNumber("weapons\\beam"); sndGSX = SC_GetSoundNumber("weapons\\GSX"); sndBlobPlasma = SC_GetSoundNumber("weapons\\plasma"); sndWormPlasma = SC_GetSoundNumber("weapons\\plasmaw"); // store contact sound numbers sndContactRico = SC_GetSoundNumber("contact\\rico"); sndContactBoom = SC_GetSoundNumber("contact\\explode"); sndContactBeam = SC_GetSoundNumber("contact\\lsrhit"); sndContactClang = SC_GetSoundNumber("contact\\clang"); sndContactBounce = SC_GetSoundNumber("contact\\bounce"); // store object die sound numbers sndPlayerDie = SC_GetSoundNumber("objects\\Scream"); sndBlobDie = SC_GetSoundNumber("objects\\BLOBDIE"); sndWormDie = SC_GetSoundNumber("objects\\wormdie"); sndMegaWormDie = SC_GetSoundNumber("objects\\MegaWormdie"); sndBabyWormDie = SC_GetSoundNumber("objects\\BabyWormdie"); sndChinookDie = sndContactBoom; sndAirFighterDie = sndContactBoom; sndBirdDie = SC_GetSoundNumber("objects\\bird"); // store other sound numbers sndDoor = SC_GetSoundNumber("switches\\door"); // store sprite numbers sprDustParticle = SC_GetSpriteTypeNumber("particleDust01.ini"); sprFireParticle = SC_GetSpriteTypeNumber("particleFire01.ini"); sprFlamerParticle = SC_GetSpriteTypeNumber("particleFlamer01.ini"); } // ********************************************************************************************************************* // this is a custom routine within this script file that creates an explosion void ExplodeAt( int x, int y, int z, int radius, int damage, int OwnerId) { int i; // play explosion sound SC_PlayDirectionalSound( sndContactBoom, x, z, ""); // apply damage SC_ApplyDamageToArea( x-radius, z-radius, x+radius, z+radius, damage, OwnerId); // spawn fire particles i = 0; while( i < 256) { i += SC_Rand(16); SC_AddParticle( x, y, z, i, 12, radius * 8, sprFireParticle); } } // ********************************************************************************************************************* // this is a custom routine within this script file that spawns bullet puff particles void SpawnBulletPuffParticles( int x, int y, int z) { int i; i = 0; while( i < 256) { i += SC_Rand(32); SC_AddParticle( x, y, z, i, 2, 16, sprDustParticle); } } // ********************************************************************************************************************* // this is a custom routine within this script file that spawns flamethrower particles void SpawnFlamerParticles( int x, int y, int z) { int i; i = 0; while( i < 256) { i += SC_Rand(24); SC_AddParticle( x, y, z, i, 1, 24, sprFlamerParticle); } } // ********************************************************************************************************************* /* fires a weapon a the specific coordinates (called by the game directly). - WeaponNumber = The weapon number, normally defined by a constant at the top of this file. - OriginX, OriginZ = The 2D coorindates of the projectile's spawn location (the height 'Y' is automatic/common for all projectiles) - angle = The angle to fire at where 0 is up, 64 is right, 128 is down and so on (for example 32 = 45 deg). - OwnerObjectId = The object ID to not hit with the projectile! Use -1 for none. */ void OnFireWeapon( int WeaponNumber, int OriginX, int OriginY, int OriginZ, int angle, int OwnerObjectId) { int i; int range; range = SC_GetWeaponRange( WeaponNumber); // chainsaw if( WeaponNumber == weapChainsaw) { SC_PlayDirectionalSound( sndChainsaw, OriginX, OriginZ, ""); angle = angle - 3 + SC_Rand(6); // random scatter of 6 SC_SpawnProjectile( pSawGore, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // pistol else if( WeaponNumber == weapPistol) { SC_PlayDirectionalSound( sndPistol, OriginX, OriginZ, ""); SC_SpawnProjectile( pBullet, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // machine gun else if( WeaponNumber == weapMachineGun) { SC_PlayDirectionalSound( sndMachineGun, OriginX, OriginZ, ""); angle = angle - 1 + SC_Rand(2); // random scatter of 2 SC_SpawnProjectile( pBullet, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // riot gun (shotgun) or riot cannon else if( (WeaponNumber == weapRiotGun) || (WeaponNumber == weapRiotCannon) ) { SC_PlayDirectionalSound( sndRiotGun, OriginX, OriginZ, ""); // spawn 6 seperate shot projectiles for( i=0; i<6; i++) { angle = angle - 1 + SC_Rand(2); // random scatter of 2 SC_SpawnProjectile( pShot, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } } // flamer else if( WeaponNumber == weapFlamer) { SC_PlayDirectionalSound( sndFlamer, OriginX, OriginZ, ""); SC_SpawnProjectile( pFlames, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // heat seeker else if( WeaponNumber == weapHeatSeeker) { SC_PlayDirectionalSound( sndHeatSeeker, OriginX, OriginZ, ""); SC_SpawnProjectile( pRocket, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // energy cannon else if( WeaponNumber == weapEnergyCannon) { SC_PlayDirectionalSound( sndEnergyCannon, OriginX, OriginZ, ""); angle = angle - 1 + SC_Rand(2); // random scatter of 2 SC_SpawnProjectile( pEnergyPulse, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // super minigun else if( WeaponNumber == weapSuperMinigun) { SC_PlayDirectionalSound( sndPistol, OriginX, OriginZ, ""); angle = angle - 2 + SC_Rand(4); // random scatter of 4 SC_SpawnProjectile( pBullet, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // GSX (ion cannon) else if( WeaponNumber == weapGSX) { SC_PlayDirectionalSound( sndGSX, OriginX, OriginZ, ""); for( i=0; i<16; ++i) { SC_SpawnProjectile( pIon, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); angle += 16; } } // blob plasma else if( WeaponNumber == weapBlobPlasma) { SC_PlayDirectionalSound( sndBlobPlasma, OriginX, OriginZ, ""); SC_SpawnProjectile( pBlobPlasma, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } // worm plasma else if( WeaponNumber == weapWormPlasma) { SC_PlayDirectionalSound( sndWormPlasma, OriginX, OriginZ, ""); SC_SpawnProjectile( pWormPlasma, OriginX, OriginY, OriginZ, angle, range, OwnerObjectId); } else { SC_ConsoleMessage( "OnFireWeapon: Unknown weapon number " + WeaponNumber); } } // ********************************************************************************************************************* void OnProjectileHit( int ProjectileTypeNumber, int PosX, int PosY, int PosZ, int angle, int OwnerObjectId) { // SC_AddSprite( SC_GetSpriteTypeNumber("marker01.ini"), PosX, PosZ, 0, true); if( ProjectileTypeNumber < 0) { return; } else if( ProjectileTypeNumber == pSawGore) { SC_PlayDirectionalSound( sndContactClang, PosX, PosZ, ""); SC_ApplyDamageToArea( PosX-4, PosZ-4, PosX+4, PosZ+4, 12, OwnerObjectId); } else if( ProjectileTypeNumber == pBullet) { SC_PlayDirectionalSound( sndContactRico, PosX, PosZ, ""); SC_ApplyDamageToArea( PosX-1, PosZ-1, PosX+1, PosZ+1, 7, OwnerObjectId);; SpawnBulletPuffParticles( PosX, PosY, PosZ); } else if( ProjectileTypeNumber == pShot) { SC_PlayDirectionalSound( sndContactRico, PosX, PosZ, ""); SC_ApplyDamageToArea( PosX-1, PosZ-1, PosX+1, PosZ+1, 6, OwnerObjectId); SpawnBulletPuffParticles( PosX, PosY, PosZ); } else if( ProjectileTypeNumber == pFlames) { SC_PlayDirectionalSound( sndContactBeam, PosX, PosZ, ""); SC_ApplyDamageToArea( PosX-8, PosZ-8, PosX+8, PosZ+8, 16, OwnerObjectId); SpawnFlamerParticles( PosX, PosY, PosZ); } else if( ProjectileTypeNumber == pEnergyPulse) { SC_PlayDirectionalSound( sndContactBeam, PosX, PosZ, ""); SC_ApplyDamageToArea( PosX-4, PosZ-4, PosX+4, PosZ+4, 10, OwnerObjectId); } else if( ProjectileTypeNumber == pRocket) { SC_PlayDirectionalSound( sndContactBoom, PosX, PosZ, ""); // SC_ApplyDamageToArea( PosX-20, PosZ-20, PosX+20, PosZ+20, 60, -1); ExplodeAt( PosX, PosY, PosZ, 20, 60, -1); } else if( ProjectileTypeNumber == pIon) { SC_PlayDirectionalSound( sndContactBoom, PosX, PosZ, ""); // SC_ApplyDamageToArea( PosX-50, PosZ-50, PosX+50, PosZ+50, 120, -1); ExplodeAt( PosX, PosY, PosZ, 50, 120, -1); } else if( ProjectileTypeNumber == pBlobPlasma) { SC_PlayDirectionalSound( sndContactBeam, PosX, PosZ, ""); SC_ApplyDamageToArea( PosX-5, PosZ-5, PosX+5, PosZ+5, 4, OwnerObjectId); } else if( ProjectileTypeNumber == pWormPlasma) { SC_PlayDirectionalSound( sndContactBeam, PosX, PosZ, ""); SC_ApplyDamageToArea( PosX-5, PosZ-5, PosX+5, PosZ+5, 7, OwnerObjectId); } } // ********************************************************************************************************************* void OnObjectTypeDie( int ObjectType, int ObjectId, int PosX, int PosY, int PosZ) { if( ObjectType == objPlayer) { SC_PlayDirectionalSound( sndPlayerDie, PosX, PosZ, ""); } else if( ObjectType == objBlob) { SC_PlayDirectionalSound( sndBlobDie, PosX, PosZ, ""); } else if( ObjectType == objWorm) { SC_PlayDirectionalSound( sndWormDie, PosX, PosZ, ""); } else if( ObjectType == objMegaWorm) { SC_PlayDirectionalSound( sndMegaWormDie, PosX, PosZ, ""); } else if( ObjectType == objBabyWorm) { SC_PlayDirectionalSound( sndBabyWormDie, PosX, PosZ, ""); } else if( ObjectType == objChinook) { SC_PlayDirectionalSound( sndChinookDie, PosX, PosZ, ""); SC_PlayDirectionalSound( SC_GetSoundNumber("world\\alarm_cockpit"), PosX, PosZ, ""); } else if( ObjectType == objAttackHeli) { SC_PlayDirectionalSound( sndContactBoom, PosX, PosZ, ""); } else if( ObjectType == objAirFighter) { SC_PlayDirectionalSound( sndAirFighterDie, PosX, PosZ, ""); } else if( ObjectType == objBird) { SC_PlayDirectionalSound( sndBirdDie, PosX, PosZ, ""); } } // ********************************************************************************************************************* // There is no object ID passed to this event because the object no longer exists. void OnObjectTypeRemoved( int ObjectType, int PosX, int PosY, int PosZ, int angle, int MidPosX, int MidPosZ) { int i; if( ObjectType == objPlayer) { } else if( ObjectType == objBlob) { SC_AddSprite( SC_GetSpriteTypeNumber("wastedBlob01.ini"), MidPosX, MidPosZ, angle, true); } else if( ObjectType == objWorm) { SC_AddSprite( SC_GetSpriteTypeNumber("wastedWorm01.ini"), MidPosX, MidPosZ, angle, true); SC_AddPowerUp( SC_GetPowerUpNumber("Worm Larvae"), MidPosX, MidPosZ); } else if( ObjectType == objChinook) { SC_AddSprite( SC_GetSpriteTypeNumber("wastedChinook01.ini"), MidPosX, MidPosZ, angle, true); ExplodeAt( MidPosX, PosY + 32, MidPosZ, 50, 1000, -1); } else if( ObjectType == objAttackHeli) { SC_AddSprite( SC_GetSpriteTypeNumber("wastedAttackHeli01.ini"), MidPosX, MidPosZ, angle, true); ExplodeAt( MidPosX, PosY + 32, MidPosZ, 50, 1000, -1); } else if( ObjectType == objAirFighter) { ExplodeAt( MidPosX, PosY + 32, MidPosZ, 50, 1000, -1); } else if( ObjectType == objBird) { SC_AddSprite( SC_GetSpriteTypeNumber("wastedBird01.ini"), MidPosX, MidPosZ, angle, true); SC_PlayDirectionalSound( SC_GetSoundNumber("contact\\thud"), PosX, PosZ, ""); SC_AddPowerUp( SC_GetPowerUpNumber("Egg"), MidPosX, MidPosZ); } else if( ObjectType == objMegaWorm) { SC_AddPowerUp( SC_GetPowerUpNumber("Worm Larvae"), MidPosX, MidPosZ); for( i=0; i<8; i++) { SC_AddGameObject( SC_GetObjectTypeNumber("Baby Worm"), MidPosX - 50 + SC_Rand(100), MidPosZ - 50 + SC_Rand(100), SC_Rand(256) ); } } } // ********************************************************************************************************************* // horizontal door void OnPlayerOverTile_109( int TileLocationX, int TileLocationY) { SC_PlayDirectionalSound( sndDoor, TileLocationX * TILE_W, TileLocationY * TILE_H, ""); SC_SetMapTile( TileLocationX, TileLocationY, 111); } // ********************************************************************************************************************* // vertical door void OnPlayerOverTile_110( int TileLocationX, int TileLocationY) { SC_PlayDirectionalSound( sndDoor, TileLocationX * TILE_W, TileLocationY * TILE_H, ""); SC_SetMapTile( TileLocationX, TileLocationY, 112); } // ********************************************************************************************************************* // red door void OnPlayerOverTile_82( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // yellow door void OnPlayerOverTile_76( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // green door void OnPlayerOverTile_80( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // blue door void OnPlayerOverTile_78( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // silver door void OnPlayerOverTile_84( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // sun door void OnPlayerOverTile_88( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // moon door void OnPlayerOverTile_90( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // CD door void OnPlayerOverTile_86( int TileLocationX, int TileLocationY) { } // ********************************************************************************************************************* // b = a; // y = x; // j xboob cf b tiffq tippus