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"