zSRB2 - SRB2 for Zandronum.

Status
Not open for further replies.
Behold the power of Updates, Must get Multiplayer side finished so i can safely release v1, So err, Changes :

  • Tails now gets tired of Flying after 8 seconds, It took so many attempts to get this working, don't even bother looking at that spaghetti code.
  • 2 New Map ports, Sapphire Falls and Jade Valley.
  • Goo water now plays a sound and shows effect on touched.
  • New SRB2-ish Chasecam system based on TheArmyGuy's code (thumbs up), Completely intergrated with the game with few additions to make it work better, If Cooperative mode is on, you can toggle it on/off, else you will be forced to go into First-Person mode (Bind a key in controls list dough).
  • Chasecam settings added to options Menu, You can customize it the way you want, (Distance, Height or Rotate player).
  • Fixed a Glitch that allowed players to fire their other weapons when they had 0 Rings.
  • Minor Bug fixes & Improvements to Ring weapons.
Link Updated in the OP, Likewise.

EDIT : Please don't laugh at me :v, Slight (yet necessary) changes:
  • Switching from Third person to First person mode will now disable Player rotation option, this is to fix a weird camera issue in first person mode, you will have to re-enable it from options if that happens (at least for now).
  • Sonic's Thok now checks the camera angle instead of Player angle, This is to fix the oddity after Implementing the new Chasecam, It'll still work fine in First person mode, If Player rotation is enabled this feature is ignored.
  • Fixed the weird Falling animation after Implementing the new Chasecam.
 
Last edited:
Alright, The Multiplayer side is almost done and I'm almost ready for v1:

  • Elemental Shield Fire trail damage will reward the Fire trail owner 50 Points now.
  • Updated Sonic's Thok, It should now check whether player has touched ground before allowing him to thok again in air, rather than using cheap 25 tics delay.
  • Fixed a Glitch that allowed Player to skip Water sections (mostly).
  • Added GASP animation for both characters.
 
Hoo boy, v1, Finally ready to be launched on servers, Expect a server with this to pop out on your Doomseekers someday (Link updated in the OP likewise) Have this changes list:

  • New Shield, Armageddon Shield, Complete with it's ability, as well as a clientsided screen flash on ability activated.
  • New Server variable "maxpoints", lets you set Maximum points before map ends (you can also change that from "Gameplay options" menu).
Additionally I have fixed some bugs and Improved stability of the game and Multiplayer rounds (Major ones Included) :

  • Many scripts not related to gameplay switched to Clientsided to reduce Ping as much as possible.
  • Fixed a Scoreboard bug that was Introduced in the previous version.
  • Getting hurt should play Dropping rings sound now.
  • Fixed a Glitch that allowed players to skip their Pain state.
  • Fixed a bug that allowed players to skip Drowning.
  • Fixed a bug that removed players Ringslinger after Respawn.
  • Yet more Improvements to Drowning system.
Hopefully if i get more time i'll port some Singleplayer maps, and improve the spindash, who knows, Maybe even recreate tag (been thinking about that one for awhile), But it's unlikely to happen soon because i'm bad at finishing things, anyways feel free to have a look inside or mod it out, ACS Source is included.
 
I Have finally finished Race system, It is easy to Implement for future maps, You just copy/paste scripts from existing race maps and apply necessary changes, And also Ported every 2.0 Race map, making total of maps +20 :

  • 2.0 Race Maps Ported, complete with their gimmicks.
  • New Race system, 3 Checkpoints must be passed to complete a Lap, 3 Laps to Finish Race.
  • New Scoreboard and Proper score sorting.
  • Race Ranking, if "israce = 1" on 3 laps finished, Players will be rewarded points based on their place.
  • Increased Jump height, Apparently it was incorrect, noticed this while testing the Race maps.
  • Sonic Thok speed gain Improved, on player landed, Player speed will be reduced back to normal.
  • 60 Seconds cooldown after first place is taken, before race ends and progress to next level.
  • Random Monitors.

Link Updated in the OP.
 
Oops, sorry for being lazybones and not posting recent changes :

  • Fixed chance to get stuck on Toxic Citadel Acid pit.
  • Fixed a Major Crash caused by spamming "use ScoreboardToggle", From now on it should work just like it worked in earlier version, But still with The new additions.
  • Fixed the Unknown thing type errors in some of the maps by recreating even more things in DECORATE.
  • Improved Inventory clear, Character abilities will no longer be removed if ClearInventory(); is used.
  • Players can no longer carry their rings, shields ... etc over between maps.
  • Fixed Score issue, Players could gain points by suiciding due to Scoreboard being unable to detect negative results, From now on if player score is below 0, It will automatically return it back to 0.
  • Less chance for egg monitor trap on Random Monitors.
  • Added The missing Air Fans to "Race Alley", and Vertical Firetraps to "Burning Sands"
 
Last edited:
v2.1e, I'm abandoning future updates on this Project (not officially but still), apparently there are some Engine side limits that I cannot get rid of without modifying the Source code, which wasn't part of my plans (At least not yet), Even the netcode which is supposedly better than SRB2's started to feel fragile with all the feature I have been Implementing, features that worked perfect offline but were either ruined online or didn't work at all, This makes my effort kind of worthless and the only advantages a regular user may notice are the Uncapped FPS and the no Multiplayer control delay (despite dozens of other advantages ZDoom and GZDoom have), Either way here's last changes list :

  • Underwater system Improvements and Bug fixes, Players will get thrust out of water when exiting water section now (Not perfect, use at your own risk).
  • Race Mode now works on Coop mode too, and will no longer restart countdowns and Race scripts for new joiners.
  • Losing Elemental Shield will no longer give players Armageddon shield.
  • The game now uses SRB2 Palette, to solve some Software renderer related texture color issues.

The game is perfectly playable if you wish to try Race and Match on a Netcode that has no Control delay, But Singleplayer won't be coming anytime soon, This is as far as I go.

EDIT : Yes, Believe it or not, SRB2's Netcode, no matter how ugly it is, It still acts alot better than Zandronum's.
 
Last edited:
EDIT : Bounce Physics.

lol Sharp enemy code :

actor SharpDamager
{
Projectile
Radius 14
Height 1
Damage 1
damagetype "Blast"
+SOLID
states
{
Spawn:
TNT1 A 2
Stop
}
}

Actor IsSharp : Inventory
{
inventory.maxamount 1
}

actor Sharp 112
{
//$Category "Enemies"
Height 1
Radius 32
Health 1
Obituary ""
MONSTER
bloodtype "EnemyHurtFX1"
+NOGRAVITY
+LOOKALLAROUND
//dropitem "BigWeaponEnergySP", 16
//dropitem "BigHealth", 16
dropitem "WeaponEnergySP", 32
dropitem "SmallHealth", 32
DamageFactor "CrawlaDamager",0
mass 99999999
painchance 256
painsound "misc/my_box1_sound"
speed 3
fastspeed 4
States
{
Spawn:
TNT1 A 0 ACS_NamedExecuteAlways("SharpInventory",0,0,0,0)
goto see
See:
TNT1 A 0 A_Recoil(-0.1)
SHRP A 0 A_PlaySoundEX("weapon/gyroattack","SoundSlot6")
SHRP A 1 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
TNT1 A 0 A_Chase
TNT1 A 0 A_JumpIfTargetInLOS("SeeBeforeAttack")
goto see
SeeBeforeAttack:
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP A 1 A_Chase
SHRP A 1 A_Recoil(-0.1) SHRP A 0 A_SpawnItemEx("SharpDamager",0,0,+60)
Goto SharpAngry
SharpAngry:
SHRP B 5 A_SpawnItemEx("SharpDamager",0,0,+10)
SHRP C 5 A_SpawnItemEx("SharpDamager",0,0,+60)
SHRP D 5 A_SpawnItemEx("SharpDamager",0,0,+10)
SHRP E 5 A_SpawnItemEx("SharpDamager",0,0,+10)
goto SharpAngry2
SharpAngry2:
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Chase
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
TNT1 A 0 A_Chase
SHRP E 1 A_SpawnItemEx("SharpDamager",0,0,+10)
TNT1 A 0 A_Recoil(-0.5)
goto see
Melee:
SHRP A 1 A_SpawnItemEx("SharpDamager",0,0,+60)
TNT1 A 0 A_FaceTarget
Goto See
Death:
TNT1 A 0 A_PlaySound("my_box1_sound")
TNT1 A 0 ACS_ExecuteAlways(332)
TNT1 A 0 ACS_ExecuteAlways(313)
TNT1 A 0 A_GiveToTarget("GivePoints", 1)
SHRP A 0 A_Pain
SHRP A 0 A_Fall
SHRP A 0 A_ChangeFlag("NOGRAVITY",1)
MMFX BCDE 3
stop
Despawn:
POSS A 0
stop
}
}

And FaceStabber

actor CastleBotDamager
{
Projectile
Radius 50
Height 30
Damage 1
damagetype "Blast"
Renderstyle None
states
{
Spawn:
TNT1 A 1
Stop
}
}

actor FaceStabber Replaces ZBridge 126
{
//$Category "Enemies"
obituary ""
Height 64
Monster
Radius 32
Health 1
painchance 256
speed 0
reactiontime 5
MaxStepHeight 64
MaxDropOffHeight 64
+SHOOTABLE
-NOGRAVITY
+DONTBLAST
+NOBLOOD
+WINDTHRUST
+NODAMAGETHRUST
+NEVERRESPAWN
-NOBLOCKMONST
+LOOKALLAROUND
+ACTIVATEMCROSS
+NOINFIGHTING
+MISSILEMORE
+MISSILEEVENMORE
+ALWAYSFAST
States
{
Spawn:
CBFS A 10
Goto see
See:
CBFS B 15 A_Chase
CBFS B 1 A_Recoil(-3)
TNT1 A 0 A_JumpIfCloser(150, "Missile")
loop
Missile:
CBFS B 1 A_JumpIfCloser(500, "Missile2")
TNT1 A 0 A_SpawnItemEx("CastleBotDamager")
TNT1 A 0 A_FaceTarget
CBFS B 1 A_Recoil(-3)
goto see
Missile2:
TNT1 A 0 A_SpawnItemEx("CastleBotDamager")
TNT1 A 0 A_FaceTarget
CBFS H 15 A_Recoil(-30)
goto see
Death:
TNT1 A 0 A_PlaySound("my_box1_sound")
TNT1 A 0 ACS_ExecuteAlways(332)
TNT1 A 0 ACS_ExecuteAlways(313)
TNT1 A 0 A_GiveToTarget("GivePoints", 1)
CBFS H 0 A_Pain
CBFS H 0 A_Fall
stop
}
}
See why it's not so easy to recreate codes from Scratch (yes, Little to no effort), Thanks to the wiki it was easier to find Sprites Prefixes, sound files names, Radius and Height of many actors ... etc
 
Last edited:
I don't understand anything of coding(since im not a coder), but this looks like it is going to be a success, since its almost a whole page of updates.
 
lol, I wish, It's impossible to recreate Water physics without Source code modification, They're hard coded, I suggested a feature that allows changing that but Graf Zahl said they'd have to modify the movement system, so they won't, Same thing for Player height changing mid-level (on spindash frames).
 
Is it not possible to...make your own water? I'm not familiar with Zandronum or its scripting; assuming the limitations aren't too different from srb2, you could just give it a sector special not used by the regular game and check if the player's inside a sector with that special, and apply custom water physics.
 
You can't, Well you can but that's for Solid 3D Floors, Non Solid 3D Floors can't have special (they won't change that either, I already asked), and Water physics are hard coded (Water 3D Floors), so you can't force normal player gravity on water sections.

EDIT : Here are tickets with me asking for those to be added :

APROP_Height on Player : https://mantis.zdoom.org/view.php?id=201
Non Solid 3D Floor with Special : https://mantis.zdoom.org/view.php?id=218

Best I can do is the current low gravity trick.
 
Last edited:
The Spindash power (not added in current version) won't be transfered to the Morphed class dough, that and the player color + It takes control away from player until he stops, yet more limits :v
 
It's ... accomplished !, thought i won't be able to make it but look at that, Knuckles Gliding and Climbing (semi-final).

* See the video here.

I Just need to force player Rotation to opposite angle (shouldn't be difficult), and Implement some kind of check to make player enter Falling state, The trick here is to fire a New type of Projectile ahead of the player on his Gliding states, the Projectile will be removed 5 Tics after It's released, If it touches a wall it will enter it's "Death" state and will thrust it's origin by 4 units up.

The Projectile doesn't hurt other players but will hurt/kill Monsters, Pressing jump while climbing will thrust player in the opposite angle.
 
Woah woah, I wasn't expecting that, my crappy remake got an Article lmao.
 
Last edited:
Welp, decided to pick it up again, will be throwing few updates occasionally :

Gameplay Improvements
  • Gradually Increasing player speed.
  • Spindash charging, longer Alt fire Holding = Stronger Spindash.
  • Added Knuckles, Complete with abilities, No Forced angle due to limitations, again (sigh).
  • Bouncing on Monitor and Badniks, For Some reason doesn't work if more than 1 Player are ingame, gotta fix this later.

Map-related changes
  • Ported 10 CTF Maps, along with an incomplete test version of Twisted Terminal (Still working on Reversed Gravity), This version showcases the early version of Zoom Tubes, which will thrust the player depending on the direction they're facing, If Ambush Flag is checked, they will thrust player up, Stand Still Flag will thrust Down.
  • Even more Thing types recreated, Decoration and Hazards such as Spinning Mace and Flame Jets.
  • Blue Crawla, Robo Hood, Sharp and FaceStabber recreated.

Also CTF Support
  • Scoreboard will show captures of each team on top if CTF Mode is on.
  • Flag carrier cannot use ability.
  • Team-specific Rings and Monitors.
  • Fired Ring color changes depending on your team.

Knuckles Climbing is horribly untested online mind you, Link updated in the OP.
 
Last edited:
Ok, Bouncing on Monitors/Robots now supports up to 64 Players, Just had to change a little something, also fixed the annoying Bug that caused players to get stuck on Pain states, and fixed double shields bug.
 
Updates ....

  • Fixed a bug that allowed players to gain extra speed by Pressing Forward while spinning.
  • Race mode is finally Stable and should award players points based on their place without troubles.
  • Players can no longer Activate Checkpoint 3 Before 2, 2 Before 1 ... etc
  • Minor updates and fixes to the existing levels.
  • Fixed a Bug that allowed players to gain extra Bounce thrust by suiciding.
  • 5 Extra Race maps ported, Not a Thokfest, Rainbow Dash, Sonic Circuit, Crimson Caves, Endless Woods (woops).
 
Beep ...
  • Decreased Shields alpha, they should no longer distrot the view in First Person Mode.
  • Updated Status Bar, now acts just like the one from SRB2, It displays all of your weapons at once, and Highlights the selected one.
  • Red Ring Color Updated, also should leave sparkles behind it now just like SRB2 (again lol).
  • Ringslinger is no longer automatic, means you can't hold to fire.
  • Added CTF Flag Capture and Return Sounds (Announcer) .
  • Entering Pain state will prevent players from Picking up items until 3 Seconds after landing.
 
Status
Not open for further replies.

Who is viewing this thread (Total: 1, Members: 0, Guests: 1)

Back
Top