diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 3d22f23711..062e678549 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1448,8 +1448,10 @@ proc/process_ghost_teleport_locs()
name = "\improper Fore Block"
icon_state = "away3"
-
-
+/area/awaymission/spacebattle
+ name = "\improper Nanotrasen Cruiser"
+ icon_state = "away"
+ requires_power = 0
/////////////////////////////////////////////////////////////////////
/*
Lists of areas to be used with is_type_in_list.
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 6b86459d52..cbf1f8b973 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -4,7 +4,7 @@
/obj/effect/landmark/corpse
- var/mobname = "Uknown" //Names the mob, obviously
+ var/mobname = "Unknown" //Names the mob, obviously
var/corpseuniform = null //Set this to an object path to have the slot filled with said object on the corpse.
var/corpsesuit = null
var/corpseshoes = null
@@ -65,9 +65,93 @@
del(src)
-//An example.
+
+// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
+
+
+
+
+
+/obj/effect/landmark/corpse/syndicatesoldier
+ mobname = "Syndicate Operative"
+ corpseuniform = /obj/item/clothing/under/syndicate
+ corpsesuit = /obj/item/clothing/suit/armor/vest
+ corpseshoes = /obj/item/clothing/shoes/swat
+ corpsegloves = /obj/item/clothing/gloves/swat
+ corpseradio = /obj/item/device/radio/headset
+ corpsemask = /obj/item/clothing/mask/gas
+ corpsehelmet = /obj/item/clothing/head/helmet/swat
+ corpseback = /obj/item/weapon/storage/backpack
+ corpseid = 1
+ corpseidjob = "Operative"
+ corpseidaccess = "Syndicate"
+
+
+
+/obj/effect/landmark/corpse/syndicatecommando
+ mobname = "Syndicate Commando"
+ corpseuniform = /obj/item/clothing/under/syndicate
+ corpsesuit = /obj/item/clothing/suit/space/rig/syndi
+ corpseshoes = /obj/item/clothing/shoes/swat
+ corpsegloves = /obj/item/clothing/gloves/swat
+ corpseradio = /obj/item/device/radio/headset
+ corpsemask = /obj/item/clothing/mask/gas/syndicate
+ corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
+ corpseback = /obj/item/weapon/tank/jetpack/oxygen
+ corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen
+ corpseid = 1
+ corpseidjob = "Operative"
+ corpseidaccess = "Syndicate"
+
+
+
+///////////Civilians//////////////////////
+
+/obj/effect/landmark/corpse/chef
+ mobname = "Chef"
+ corpseuniform = /obj/item/clothing/suit/chef
+ corpsesuit = /obj/item/clothing/suit/chef/classic
+ corpseshoes = /obj/item/clothing/shoes/black
+ corpsehelmet = /obj/item/clothing/head/chefhat
+ corpseback = /obj/item/weapon/storage/backpack
+ corpseradio = /obj/item/device/radio/headset
+ corpseid = 1
+ corpseidjob = "Chef"
+ corpseidaccess = "Chef"
+
+
+/obj/effect/landmark/corpse/doctor
+ mobname = "Doctor"
+ corpseradio = /obj/item/device/radio/headset/headset_med
+ corpseuniform = /obj/item/clothing/under/rank/medical
+ corpsesuit = /obj/item/clothing/suit/labcoat
+ corpseback = /obj/item/weapon/storage/backpack/medic
+ corpsepocket1 = /obj/item/device/flashlight/pen
+ corpseshoes = /obj/item/clothing/shoes/black
+ corpseid = 1
+ corpseidjob = "Medical Doctor"
+ corpseidaccess = "Medical Doctor"
+
+/obj/effect/landmark/corpse/engineer
+ mobname = "Engineer"
+ corpseradio = /obj/item/device/radio/headset/headset_eng
+ corpseuniform = /obj/item/clothing/under/rank/engineer
+ corpseback = /obj/item/weapon/storage/backpack/industrial
+ corpseshoes = /obj/item/clothing/shoes/orange
+ corpsebelt = /obj/item/weapon/storage/belt/utility/full
+ corpsegloves = /obj/item/clothing/gloves/yellow
+ corpsehelmet = /obj/item/clothing/head/hardhat
+ corpseid = 1
+ corpseidjob = "Station Engineer"
+ corpseidaccess = "Station Engineer"
+
+/obj/effect/landmark/corpse/engineer/rig
+ corpsesuit = /obj/item/clothing/suit/space/rig
+ corpsemask = /obj/item/clothing/mask/breath
+ corpsehelmet = /obj/item/clothing/head/helmet/space/rig
+
/obj/effect/landmark/corpse/clown
- mobname = "Giggles"
+ mobname = "Clown"
corpseuniform = /obj/item/clothing/under/rank/clown
corpseshoes = /obj/item/clothing/shoes/clown_shoes
corpseradio = /obj/item/device/radio/headset
@@ -78,4 +162,13 @@
corpseidjob = "Clown"
corpseidaccess = "Clown"
-// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
\ No newline at end of file
+/obj/effect/landmark/corpse/scientist
+ mobname = "Scientist"
+ corpseradio = /obj/item/device/radio/headset/headset_sci
+ corpseuniform = /obj/item/clothing/under/rank/scientist
+ corpsesuit = /obj/item/clothing/suit/labcoat/science
+ corpseback = /obj/item/weapon/storage/backpack
+ corpseshoes = /obj/item/clothing/shoes/white
+ corpseid = 1
+ corpseidjob = "Scientist"
+ corpseidaccess = "Scientist"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/clown.dm b/code/modules/mob/living/simple_animal/clown.dm
index c75f167213..e8cbe2d2db 100644
--- a/code/modules/mob/living/simple_animal/clown.dm
+++ b/code/modules/mob/living/simple_animal/clown.dm
@@ -48,20 +48,12 @@
var/mob/living/target_mob
/mob/living/simple_animal/clown/Life()
- if(stat == DEAD)
- walk(src,0)//STOP FUCKING MOVING GODDAMN
- if(health > 0)
- icon_state = icon_living
- dead_mob_list -= src
- living_mob_list += src
- stat = CONSCIOUS
- density = 1
+ ..()
+ if(stat == 2)
+ new /obj/effect/landmark/corpse/clown (src.loc)
+ del src
return
-
- if(health < 1)
- Die()
-
if(health > maxHealth)
health = maxHealth
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index abc399a498..afe96d85bd 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -14,6 +14,15 @@
stop_automated_movement = 1
status_flags = CANPARALYSE
attack_sound = 'sound/weapons/punch1.ogg'
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
/mob/living/simple_animal/construct/Life()
diff --git a/code/modules/mob/living/simple_animal/syndicate.dm b/code/modules/mob/living/simple_animal/syndicate.dm
new file mode 100644
index 0000000000..b6846ae380
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/syndicate.dm
@@ -0,0 +1,278 @@
+#define SYNDICATE_STANCE_IDLE 1
+#define SYNDICATE_STANCE_ATTACK 2
+#define SYNDICATE_STANCE_ATTACKING 3
+
+/mob/living/simple_animal/syndicate
+ name = "Syndicate Operative"
+ desc = "Death to Nanotrasen."
+ icon_state = "syndicate"
+ icon_living = "syndicate"
+ icon_dead = "syndicate_dead"
+ icon_gib = "syndicate_gib"
+ speak_chance = 0
+ turns_per_move = 5
+ response_help = "pokes the"
+ response_disarm = "shoves the"
+ response_harm = "hits the"
+ speed = -1
+ stop_automated_movement_when_pulled = 0
+ maxHealth = 75
+ health = 75
+ var/ranged = 0
+ var/target
+ var/rapid = 0
+ harm_intent_damage = 5
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ attacktext = "punches"
+ a_intent = "harm"
+ var/corpse = /obj/effect/landmark/corpse/syndicatesoldier
+ var/weapon1
+ var/weapon2
+ min_oxy = 5
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 1
+ min_co2 = 0
+ max_co2 = 5
+ min_n2 = 0
+ max_n2 = 0
+ unsuitable_atoms_damage = 15
+
+ var/stance = SYNDICATE_STANCE_IDLE //Used to determine behavior
+ var/mob/living/target_mob
+
+/mob/living/simple_animal/syndicate/Life()
+ ..()
+ if(stat == 2)
+ new corpse (src.loc)
+ if(weapon1)
+ new weapon1 (src.loc)
+ if(weapon2)
+ new weapon2 (src.loc)
+ del src
+ return
+
+
+ if(health < 1)
+ Die()
+
+ if(health > maxHealth)
+ health = maxHealth
+
+ if(!ckey && !stop_automated_movement)
+ if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
+ turns_since_move++
+ if(turns_since_move >= turns_per_move)
+ if(!(stop_automated_movement_when_pulled && pulledby))
+ Move(get_step(src,pick(cardinal)))
+ turns_since_move = 0
+
+ if(!stat)
+ switch(stance)
+ if(SYNDICATE_STANCE_IDLE)
+ stop_automated_movement = 0
+ for( var/mob/living/L in viewers(7,src) )
+ if(isSyndicate(L)) continue
+ if(!L.stat)
+ stance = SYNDICATE_STANCE_ATTACK
+ target_mob = L
+ break
+
+ if(SYNDICATE_STANCE_ATTACK) //This one should only be active for one tick
+ stop_automated_movement = 1
+ if(!target_mob || target_mob.stat)
+ stance = SYNDICATE_STANCE_IDLE
+ if(target_mob in viewers(10,src))
+ if(ranged)
+ if(get_dist(src, target_mob) <= 6)
+ OpenFire(target_mob)
+ else
+ walk_to(src, target_mob, 1, 3)
+ else
+ walk_to(src, target_mob, 1, 3)
+ stance = SYNDICATE_STANCE_ATTACKING
+
+ if(SYNDICATE_STANCE_ATTACKING)
+ stop_automated_movement = 1
+ if(!target_mob || target_mob.stat)
+ stance = SYNDICATE_STANCE_IDLE
+ target_mob = null
+ return
+ if(!(target_mob in viewers(7,src)))
+ stance = SYNDICATE_STANCE_IDLE
+ target_mob = null
+ return
+ if(get_dist(src, target_mob) <= 1) //Attacking
+ if(isliving(target_mob))
+ var/mob/living/L = target_mob
+ L.attack_animal(src)
+
+
+
+/mob/living/simple_animal/syndicate/proc/OpenFire(target_mob)
+ src.target = target_mob
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [src] fires at [src.target]!", 1)
+
+ var/tturf = get_turf(target)
+ if(rapid)
+ spawn(1)
+ Shoot(tturf, src.loc, src)
+ new /obj/item/ammo_casing/a12mm(get_turf(src))
+ spawn(4)
+ Shoot(tturf, src.loc, src)
+ new /obj/item/ammo_casing/a12mm(get_turf(src))
+ spawn(6)
+ Shoot(tturf, src.loc, src)
+ new /obj/item/ammo_casing/a12mm(get_turf(src))
+ else
+ Shoot(tturf, src.loc, src)
+ new /obj/item/ammo_casing/a12mm(get_turf(src))
+
+ stance = SYNDICATE_STANCE_ATTACK
+ return
+
+
+/mob/living/simple_animal/syndicate/proc/Shoot(var/target, var/start, var/user, var/bullet = 0)
+ if(target == start)
+ return
+
+ var/obj/item/projectile/bullet/midbullet2/A = new /obj/item/projectile/bullet/midbullet2(user:loc)
+ playsound(user, 'sound/weapons/Gunshot_smg.ogg', 100, 1)
+ if(!A) return
+
+ if (!istype(target, /turf))
+ del(A)
+ return
+ A.current = target
+ A.yo = target:y - start:y
+ A.xo = target:x - start:x
+ spawn( 0 )
+ A.process()
+ return
+
+
+
+///////////////Sword and shield////////////
+
+/mob/living/simple_animal/syndicate/melee
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ icon_state = "syndicatemelee"
+ icon_living = "syndicatemelee"
+ weapon1 = /obj/item/weapon/melee/energy/sword/red
+ weapon2 = /obj/item/weapon/shield/energy
+ attacktext = "slashes"
+
+/mob/living/simple_animal/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(O.force)
+ if(prob(35))
+ health -= O.force
+ for(var/mob/M in viewers(src, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ else
+ for(var/mob/M in viewers(src, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red \b [src] blocks the [O] with its shield! ")
+ else
+ usr << "\red This weapon is ineffective, it does no damage."
+ for(var/mob/M in viewers(src, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red [user] gently taps [src] with the [O]. ")
+
+
+/mob/living/simple_animal/syndicate/melee/bullet_act(var/obj/item/projectile/Proj)
+ if(!Proj) return
+ if(prob(35))
+ src.health -= Proj.damage
+ else
+ visible_message("\red [src] blocks [Proj] with its shield!")
+ return 0
+
+
+/mob/living/simple_animal/syndicate/melee/space
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
+ icon_state = "syndicatemeleespace"
+ icon_living = "syndicatemeleespace"
+ name = "Syndicate Commando"
+ corpse = /obj/effect/landmark/corpse/syndicatecommando
+
+/mob/living/simple_animal/syndicate/melee/space/Process_Spacemove(var/check_drift = 0)
+ return
+
+/mob/living/simple_animal/syndicate/ranged
+ ranged = 1
+ rapid = 1
+ icon_state = "syndicateranged"
+ icon_living = "syndicateranged"
+ weapon1 = /obj/item/weapon/gun/projectile/automatic/c20r
+
+/mob/living/simple_animal/syndicate/ranged/space
+ icon_state = "syndicaterangedpsace"
+ icon_living = "syndicaterangedpsace"
+ name = "Syndicate Commando"
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
+ corpse = /obj/effect/landmark/corpse/syndicatecommando
+
+/mob/living/simple_animal/syndicate/ranged/space/Process_Spacemove(var/check_drift = 0)
+ return
+
+
+
+
+
+
+
+
+/mob/living/simple_animal/syndicate/Bump(atom/movable/AM as mob|obj, yes)
+ spawn( 0 )
+ if ((!( yes ) || now_pushing))
+ return
+ now_pushing = 1
+ if(ismob(AM))
+ var/mob/tmob = AM
+ if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
+ if(prob(5))
+ src << "\red You fail to push [tmob]'s fat ass out of the way."
+ now_pushing = 0
+ return
+ if(tmob.nopush)
+ now_pushing = 0
+ return
+
+ tmob.LAssailant = src
+ now_pushing = 0
+ ..()
+ if (!( istype(AM, /atom/movable) ))
+ return
+ if (!( now_pushing ))
+ now_pushing = 1
+ if (!( AM.anchored ))
+ var/t = get_dir(src, AM)
+ if (istype(AM, /obj/structure/window))
+ if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
+ for(var/obj/structure/window/win in get_step(AM,t))
+ now_pushing = 0
+ return
+ step(AM, t)
+ now_pushing = null
+ return
+ return
\ No newline at end of file
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 679ead3e9e..2a0310752c 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -75,6 +75,11 @@
return 1
return 0
+/proc/isSyndicate(A)
+ if(istype(A, /mob/living/simple_animal/syndicate))
+ return 1
+ return 0
+
/proc/isclown(A)
if(istype(A, /mob/living/simple_animal/clown))
return 1
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index f752eea47f..e59190f7c0 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -18,6 +18,9 @@
stun = 5
weaken = 5
+/obj/item/projectile/bullet/midbullet2
+ damage = 25
+
/obj/item/projectile/bullet/suffocationbullet//How does this even work?
name = "co bullet"
damage = 20
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index f512a0037b..83645fb002 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 47075b0ec2..1ec1f3a85a 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 0b58dfc69e..9e2b55ad51 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -205,7 +205,9 @@
#define FILE_DIR "icons/vending_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
+#define FILE_DIR "maps/backup"
#define FILE_DIR "maps/RandomZLevels"
+#define FILE_DIR "maps/RandomZLevels/backup"
#define FILE_DIR "sound"
#define FILE_DIR "sound/AI"
#define FILE_DIR "sound/ambience"
@@ -1086,7 +1088,6 @@
#include "code\modules\mob\living\silicon\robot\say.dm"
#include "code\modules\mob\living\silicon\robot\wires.dm"
#include "code\modules\mob\living\simple_animal\bear.dm"
-#include "code\modules\mob\living\simple_animal\behemoth.dm"
#include "code\modules\mob\living\simple_animal\carp.dm"
#include "code\modules\mob\living\simple_animal\cat.dm"
#include "code\modules\mob\living\simple_animal\clown.dm"
@@ -1099,6 +1100,7 @@
#include "code\modules\mob\living\simple_animal\parrot.dm"
#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
+#include "code\modules\mob\living\simple_animal\syndicate.dm"
#include "code\modules\mob\living\simple_animal\tomato.dm"
#include "code\modules\mob\living\simple_animal\update_icons.dm"
#include "code\modules\mob\living\simple_animal\worm.dm"