mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 13:37:58 +01:00
Merge pull request #1560 from caelaislinn/master
simple_animals updates, exodus mapchanges, supply pack updates
This commit is contained in:
+8
-2
@@ -1074,15 +1074,20 @@
|
||||
#include "code\modules\mob\organ\organ_external.dm"
|
||||
#include "code\modules\mob\organ\organ_internal.dm"
|
||||
#include "code\modules\mob\organ\pain.dm"
|
||||
#include "code\modules\mob\simple_animal\bear.dm"
|
||||
#include "code\modules\mob\simple_animal\behemoth.dm"
|
||||
#include "code\modules\mob\simple_animal\carp.dm"
|
||||
#include "code\modules\mob\simple_animal\cat.dm"
|
||||
#include "code\modules\mob\simple_animal\constructs.dm"
|
||||
#include "code\modules\mob\simple_animal\corgi.dm"
|
||||
#include "code\modules\mob\simple_animal\crab.dm"
|
||||
#include "code\modules\mob\simple_animal\life.dm"
|
||||
#include "code\modules\mob\simple_animal\munchkin.dm"
|
||||
#include "code\modules\mob\simple_animal\kobold.dm"
|
||||
#include "code\modules\mob\simple_animal\mouse.dm"
|
||||
#include "code\modules\mob\simple_animal\parrot.dm"
|
||||
#include "code\modules\mob\simple_animal\shade.dm"
|
||||
#include "code\modules\mob\simple_animal\simple_animal.dm"
|
||||
#include "code\modules\mob\simple_animal\simple_animal_life.dm"
|
||||
#include "code\modules\mob\simple_animal\simple_animal_misc.dm"
|
||||
#include "code\modules\mob\simple_animal\worm.dm"
|
||||
#include "code\modules\power\apc.dm"
|
||||
#include "code\modules\power\cable.dm"
|
||||
@@ -1197,6 +1202,7 @@
|
||||
#include "code\WorkInProgress\animusstation\atm.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\energy_field.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\external_shield_gen.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\meteor_battery.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\sculpture.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\shield_capacitor.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\shield_gen.dm"
|
||||
|
||||
@@ -0,0 +1,261 @@
|
||||
#define MISSILE_SPEED 5
|
||||
|
||||
//automated turret that shoots missiles at meteors
|
||||
|
||||
/obj/item/projectile/missile
|
||||
name = "missile"
|
||||
icon = 'meteor_turret.dmi'
|
||||
icon_state = "missile"
|
||||
var/turf/target
|
||||
var/tracking = 0
|
||||
density = 1
|
||||
desc = "It's sparking and shaking slightly."
|
||||
|
||||
/obj/item/projectile/missile/fired(var/turf/newtarget)
|
||||
target = newtarget
|
||||
dir = get_dir(src.loc, target)
|
||||
walk_towards(src, target, MISSILE_SPEED)
|
||||
|
||||
/obj/item/projectile/missile/Bump(atom/A)
|
||||
spawn(0)
|
||||
if(istype(A,/obj/effect/meteor))
|
||||
del(A)
|
||||
explode()
|
||||
return
|
||||
|
||||
/obj/item/projectile/missile/proc/explode()
|
||||
explosion(src.loc, 1, 1, 2, 7, 0)
|
||||
playsound(src.loc, "explosion", 50, 1)
|
||||
del(src)
|
||||
|
||||
/obj/item/projectile/missile/attack_hand(mob/user)
|
||||
..()
|
||||
return attackby(null, user)
|
||||
|
||||
/obj/item/projectile/missile/attackby(obj/item/weapon/W, mob/user)
|
||||
//can't touch this
|
||||
..()
|
||||
explode()
|
||||
|
||||
/obj/machinery/meteor_battery
|
||||
name = "meteor battery"
|
||||
icon = 'meteor_turret.dmi'
|
||||
icon_state = "turret0"
|
||||
var/raised = 0
|
||||
var/enabled = 1
|
||||
anchored = 1
|
||||
layer = 3
|
||||
invisibility = 2
|
||||
density = 1
|
||||
var/health = 18
|
||||
var/id = ""
|
||||
var/obj/machinery/turretcover/cover = null
|
||||
var/popping = 0
|
||||
var/wasvalid = 0
|
||||
var/lastfired = 0
|
||||
var/shot_delay = 50
|
||||
var/datum/effect/effect/system/spark_spread/spark_system
|
||||
use_power = 1
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 300
|
||||
var/atom/movable/cur_target
|
||||
var/targeting_active = 0
|
||||
var/protect_range = 30
|
||||
var/tracking_missiles = 0
|
||||
var/list/fired_missiles
|
||||
|
||||
/obj/machinery/meteor_battery/New()
|
||||
spark_system = new /datum/effect/effect/system/spark_spread
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
fired_missiles = new/list()
|
||||
// targets = new
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/proc/isPopping()
|
||||
return (popping!=0)
|
||||
|
||||
/obj/machinery/meteor_battery/power_change()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "broke"
|
||||
else
|
||||
if( powered() )
|
||||
if (src.enabled)
|
||||
icon_state = "turret1"
|
||||
else
|
||||
icon_state = "turret0"
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
spawn(rand(0, 15))
|
||||
src.icon_state = "turret0"
|
||||
stat |= NOPOWER
|
||||
|
||||
/obj/machinery/meteor_battery/proc/setState(var/enabled)
|
||||
src.enabled = enabled
|
||||
src.power_change()
|
||||
|
||||
/obj/machinery/meteor_battery/proc/get_new_target()
|
||||
var/list/new_targets = new
|
||||
var/new_target
|
||||
for(var/obj/effect/meteor/M in view(protect_range, get_turf(src)))
|
||||
new_targets += M
|
||||
if(new_targets.len)
|
||||
new_target = pick(new_targets)
|
||||
return new_target
|
||||
|
||||
/obj/machinery/meteor_battery/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(src.cover==null)
|
||||
src.cover = new /obj/machinery/turretcover(src.loc)
|
||||
src.cover.host = src
|
||||
if(!enabled)
|
||||
if(!isDown() && !isPopping())
|
||||
popDown()
|
||||
return
|
||||
|
||||
//update our missiles
|
||||
for(var/obj/item/projectile/missile/M in fired_missiles)
|
||||
if(!M)
|
||||
fired_missiles.Remove(M)
|
||||
continue
|
||||
if(tracking_missiles && cur_target)
|
||||
//update homing missile target
|
||||
M.target = get_turf(cur_target)
|
||||
walk_towards(M, M.target, MISSILE_SPEED)
|
||||
|
||||
if(get_turf(M) == M.target && M)
|
||||
//missile has arrived at destination
|
||||
fired_missiles.Remove(M)
|
||||
if( istype(get_turf(M), /turf/space) )
|
||||
//send the missile shooting off into the distance
|
||||
walk(M, get_dir(src,M), MISSILE_SPEED)
|
||||
spawn(rand(3,10) * 10)
|
||||
if(M)
|
||||
M.explode()
|
||||
else if(rand(3) == 3)
|
||||
//chance to blow up later (between 4 seconds and 2 minutes), or just sit there being ominous
|
||||
spawn(rand(4,120) * 10)
|
||||
M.explode()
|
||||
for(var/mob/P in view(7))
|
||||
P.visible_message("\red The missile skids to a halt, vibrating and sparking ominously!")
|
||||
|
||||
if(!cur_target)
|
||||
cur_target = get_new_target() //get new target
|
||||
|
||||
if(cur_target) //if it's found, proceed
|
||||
if(!isPopping())
|
||||
if(isDown())
|
||||
popUp()
|
||||
use_power = 2
|
||||
else
|
||||
spawn()
|
||||
if(!targeting_active)
|
||||
targeting_active = 1
|
||||
target()
|
||||
targeting_active = 0
|
||||
else if(!isPopping())//else, pop down
|
||||
if(!isDown())
|
||||
popDown()
|
||||
use_power = 1
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/proc/target()
|
||||
while(src && enabled && !stat)
|
||||
src.dir = get_dir(src, cur_target)
|
||||
shootAt(cur_target)
|
||||
sleep(shot_delay)
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/proc/shootAt(var/atom/movable/target)
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(target)
|
||||
if (!T || !U)
|
||||
return
|
||||
use_power(500)
|
||||
var/obj/item/projectile/missile/A = new(T)
|
||||
A.tracking = tracking_missiles
|
||||
fired_missiles.Add(A)
|
||||
spawn(0)
|
||||
A.fired(U)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/meteor_battery/proc/isDown()
|
||||
return (invisibility!=0)
|
||||
|
||||
/obj/machinery/meteor_battery/proc/popUp()
|
||||
if ((!isPopping()) || src.popping==-1)
|
||||
invisibility = 0
|
||||
popping = 1
|
||||
if (src.cover!=null)
|
||||
flick("popup", src.cover)
|
||||
src.cover.icon_state = "openTurretCover"
|
||||
spawn(10)
|
||||
if (popping==1) popping = 0
|
||||
|
||||
/obj/machinery/meteor_battery/proc/popDown()
|
||||
if ((!isPopping()) || src.popping==1)
|
||||
popping = -1
|
||||
if (src.cover!=null)
|
||||
flick("popdown", src.cover)
|
||||
src.cover.icon_state = "turretCover"
|
||||
spawn(10)
|
||||
if (popping==-1)
|
||||
invisibility = 2
|
||||
popping = 0
|
||||
|
||||
/obj/machinery/meteor_battery/bullet_act(var/obj/item/projectile/Proj)
|
||||
src.health -= Proj.damage
|
||||
..()
|
||||
if(prob(45) && Proj.damage > 0) src.spark_system.start()
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
|
||||
..()
|
||||
playsound(src.loc, 'smash.ogg', 60, 1)
|
||||
src.spark_system.start()
|
||||
src.health -= W.force * 0.5
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/emp_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
enabled = 0
|
||||
power_change()
|
||||
..()
|
||||
|
||||
/obj/machinery/meteor_battery/ex_act(severity)
|
||||
if(severity < 3)
|
||||
src.die()
|
||||
|
||||
/obj/machinery/meteor_battery/proc/die()
|
||||
src.health = 0
|
||||
src.density = 0
|
||||
src.stat |= BROKEN
|
||||
src.icon_state = "broke"
|
||||
if (cover!=null)
|
||||
del(cover)
|
||||
sleep(3)
|
||||
flick("explosion", src)
|
||||
spawn(13)
|
||||
del(src)
|
||||
|
||||
/obj/machinery/meteor_battery/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(!(stat & BROKEN))
|
||||
playsound(src.loc, 'slash.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has slashed at []!</B>", M, src), 1)
|
||||
src.health -= 15
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
else
|
||||
M << "\green That object is useless to you."
|
||||
return
|
||||
@@ -23,7 +23,7 @@
|
||||
Life()
|
||||
..()
|
||||
|
||||
if(alive)
|
||||
if(stat != DEAD)
|
||||
meat_amount = round(nutrition / 50)
|
||||
|
||||
nutrition_step--
|
||||
@@ -152,7 +152,7 @@
|
||||
..()
|
||||
|
||||
// go right before cycle elapses, and if animal isn't starving
|
||||
if(alive && nutrition_step == 1 && nutrition > max_nutrition / 2)
|
||||
if(stat != DEAD && nutrition_step == 1 && nutrition > max_nutrition / 2)
|
||||
// lay an egg with probability of 5% in 5 second time period
|
||||
if(prob(33))
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/egg(src.loc) // lay an egg
|
||||
|
||||
@@ -274,33 +274,48 @@
|
||||
|
||||
/datum/supply_packs/internals
|
||||
name = "Internals crate"
|
||||
contains = list("/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
contains = list("/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air")
|
||||
cost = 10
|
||||
cost = 30
|
||||
containertype = "/obj/structure/closet/crate/internals"
|
||||
containername = "Internals crate"
|
||||
|
||||
/datum/supply_packs/emergency_internals
|
||||
name = "Emergency Internals crate"
|
||||
contains = list("/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen")
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/internals"
|
||||
containername = "Emergency Internals crate"
|
||||
|
||||
/datum/supply_packs/evacuation
|
||||
name = "Emergency equipment"
|
||||
contains = list("/obj/machinery/bot/floorbot",
|
||||
"/obj/machinery/bot/floorbot",
|
||||
"/obj/machinery/bot/medbot",
|
||||
"/obj/machinery/bot/medbot",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
contains = list("/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas")
|
||||
cost = 35
|
||||
"/obj/item/weapon/storage/toolbox/emergency",
|
||||
"/obj/item/weapon/storage/toolbox/emergency",
|
||||
"/obj/item/weapon/storage/toolbox/emergency",
|
||||
"/obj/item/weapon/chem_grenade/metalfoam",
|
||||
"/obj/item/weapon/chem_grenade/metalfoam")
|
||||
cost = 15
|
||||
containertype = "/obj/structure/closet/crate/internals"
|
||||
containername = "Emergency Crate"
|
||||
|
||||
@@ -435,7 +450,7 @@
|
||||
"/obj/item/weapon/reagent_containers/glass/bottle/stoxin",
|
||||
"/obj/item/weapon/storage/syringes",
|
||||
"/obj/item/weapon/reagent_containers/glass/large")
|
||||
cost = 10
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/medical"
|
||||
containername = "Medical crate"
|
||||
group = "Medical / Science"
|
||||
@@ -488,7 +503,7 @@
|
||||
"/obj/item/weapon/cell",
|
||||
"/obj/item/weapon/cell/high",
|
||||
"/obj/item/weapon/cell/high")
|
||||
cost = 15
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Electrical maintenance crate"
|
||||
access = ACCESS_ENGINE
|
||||
@@ -498,19 +513,49 @@
|
||||
name = "Mechanical maintenance crate"
|
||||
contains = list("/obj/item/weapon/storage/belt/utility/full",
|
||||
"/obj/item/weapon/storage/belt/utility/full",
|
||||
"/obj/item/weapon/storage/belt/utility/full",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/head/helmet/welding",
|
||||
"/obj/item/clothing/head/helmet/welding",
|
||||
"/obj/item/clothing/head/helmet/hardhat")
|
||||
cost = 10
|
||||
"/obj/item/weapon/storage/toolbox/mechanical",
|
||||
"/obj/item/weapon/storage/toolbox/mechanical")
|
||||
cost = 15
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Mechanical maintenance crate"
|
||||
access = ACCESS_ENGINE
|
||||
group = "Engineering"
|
||||
|
||||
//"/obj/item/tape/engineering"
|
||||
|
||||
/datum/supply_packs/safety_gear
|
||||
name = "Safety gear crate"
|
||||
contains = list("/obj/item/clothing/gloves/fingerless/black",
|
||||
"/obj/item/clothing/gloves/fingerless/black",
|
||||
"/obj/item/device/flashlight",
|
||||
"/obj/item/device/flashlight",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/head/helmet/hardhat",
|
||||
"/obj/item/clothing/head/helmet/hardhat")
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Safety gear crate"
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/firefighting
|
||||
name = "Firefighting equipment crate"
|
||||
contains = list("/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/head/helmet/space/fire_helmet",
|
||||
"/obj/item/clothing/head/helmet/space/fire_helmet",
|
||||
"/obj/item/clothing/suit/fire/heavy",
|
||||
"/obj/item/clothing/suit/fire/heavy",
|
||||
"/obj/item/weapon/extinguisher",
|
||||
"/obj/item/weapon/extinguisher")
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/firefighting"
|
||||
containername = "Firefighting equipment crate"
|
||||
group = "Engineering"
|
||||
access = ACCESS_ATMOSPHERICS
|
||||
|
||||
/datum/supply_packs/waterfueltank
|
||||
name = "Water/Fuel tank crate"
|
||||
contains = list("/obj/structure/reagent_dispensers/watertank",
|
||||
@@ -523,7 +568,7 @@
|
||||
name = "Emitter crate"
|
||||
contains = list("/obj/machinery/emitter",
|
||||
"/obj/machinery/emitter",)
|
||||
cost = 10
|
||||
cost = 15
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Emitter crate"
|
||||
access = ACCESS_HEADS
|
||||
@@ -534,12 +579,14 @@
|
||||
contains = list("/obj/machinery/field_generator",
|
||||
"/obj/machinery/field_generator",)
|
||||
containername = "Field Generator crate"
|
||||
cost = 15
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/engine/sing_gen
|
||||
name = "Singularity Generator crate"
|
||||
contains = list("/obj/machinery/the_singularitygen")
|
||||
containername = "Singularity Generator crate"
|
||||
cost = 15
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/engine/collector
|
||||
@@ -548,6 +595,7 @@
|
||||
"/obj/machinery/power/rad_collector",
|
||||
"/obj/machinery/power/rad_collector")
|
||||
containername = "Collector crate"
|
||||
cost = 15
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/engine/PA
|
||||
@@ -578,18 +626,32 @@
|
||||
name = "Surgery crate"
|
||||
contains = list("/obj/item/weapon/cautery",
|
||||
"/obj/item/weapon/surgicaldrill",
|
||||
"/obj/item/clothing/mask/breath/medical",
|
||||
"/obj/item/weapon/tank/anesthetic",
|
||||
"/obj/item/weapon/hemostat",
|
||||
"/obj/item/weapon/scalpel",
|
||||
"/obj/item/weapon/surgical_tool/bonegel",
|
||||
"/obj/item/weapon/retractor",
|
||||
"/obj/item/weapon/surgical_tool/bonesetter",
|
||||
"/obj/item/weapon/circular_saw")
|
||||
cost = 20
|
||||
cost = 25
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Surgery crate"
|
||||
access = ACCESS_MEDICAL
|
||||
group = "Medical / Science"
|
||||
|
||||
/datum/supply_packs/sterile
|
||||
name = "Sterile equipment crate"
|
||||
contains = list("/obj/item/clothing/under/rank/medical/green",
|
||||
"/obj/item/clothing/under/rank/medical/green",
|
||||
"/obj/item/store/stma_kit",
|
||||
"/obj/item/store/lglo_kit")
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Sterile equipment crate"
|
||||
access = ACCESS_MEDICAL
|
||||
group = "Medical / Science"
|
||||
|
||||
/datum/supply_packs/mecha_odysseus
|
||||
name = "Circuit Crate (\"Odysseus\")"
|
||||
contains = list(
|
||||
|
||||
+7
-12
@@ -205,16 +205,9 @@ proc/countJob(rank)
|
||||
update_clothing()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/equip_if_possible(obj/item/W, slot, del_on_fail = 1) // since byond doesn't seem to have pointers, this seems like the best way to do this :/
|
||||
//warning: icky code
|
||||
var/equipped = 0
|
||||
if((slot == l_store || slot == r_store || slot == belt || slot == wear_id) && !src.w_uniform)
|
||||
del(W)
|
||||
return
|
||||
if(slot == s_store && !src.wear_suit)
|
||||
del(W)
|
||||
return
|
||||
switch(slot)
|
||||
if(slot_back)
|
||||
if(!src.back)
|
||||
@@ -237,11 +230,11 @@ proc/countJob(rank)
|
||||
src.r_hand = W
|
||||
equipped = 1
|
||||
if(slot_belt)
|
||||
if(!src.belt)
|
||||
if(!src.belt && src.w_uniform)
|
||||
src.belt = W
|
||||
equipped = 1
|
||||
if(slot_wear_id)
|
||||
if(!src.wear_id)
|
||||
if(!src.wear_id && src.w_uniform)
|
||||
src.wear_id = W
|
||||
equipped = 1
|
||||
if(slot_ears)
|
||||
@@ -276,15 +269,15 @@ proc/countJob(rank)
|
||||
src.w_uniform = W
|
||||
equipped = 1
|
||||
if(slot_l_store)
|
||||
if(!src.l_store)
|
||||
if(!src.l_store && src.w_uniform)
|
||||
src.l_store = W
|
||||
equipped = 1
|
||||
if(slot_r_store)
|
||||
if(!src.r_store)
|
||||
if(!src.r_store && src.w_uniform)
|
||||
src.r_store = W
|
||||
equipped = 1
|
||||
if(slot_s_store)
|
||||
if(!src.s_store)
|
||||
if(!src.s_store && src.wear_suit)
|
||||
src.s_store = W
|
||||
equipped = 1
|
||||
if(slot_in_backpack)
|
||||
@@ -296,6 +289,8 @@ proc/countJob(rank)
|
||||
|
||||
if(equipped)
|
||||
W.layer = 20
|
||||
if(src.back && W.loc != src.back)
|
||||
W.loc = src
|
||||
else
|
||||
if (del_on_fail)
|
||||
del(W)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger/angry =4,
|
||||
// /obj/item/weapon/pickaxe/hammer =4, //Waiting on a sprite
|
||||
// /obj/item/weapon/pickaxe/hammer =4, //Waiting on a sprite
|
||||
/obj/item/weapon/pickaxe/silver =4,
|
||||
/obj/item/weapon/pickaxe/drill =4,
|
||||
/obj/item/weapon/pickaxe/jackhammer =4,
|
||||
/obj/effect/critter/spesscarp/elite =3,
|
||||
/mob/living/simple_animal/carp/elite =3,
|
||||
/obj/item/weapon/pickaxe/diamond =3,
|
||||
/obj/item/weapon/pickaxe/diamonddrill =3,
|
||||
/obj/item/weapon/pickaxe/gold =3,
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
for(var/obj/effect/landmark/C in world)
|
||||
if(C.name == "carpspawn")
|
||||
if(prob(99))
|
||||
new /obj/effect/critter/spesscarp(C.loc)
|
||||
new /mob/living/simple_animal/carp(C.loc)
|
||||
else
|
||||
new /obj/effect/critter/spesscarp/elite(C.loc)
|
||||
new /mob/living/simple_animal/carp/elite(C.loc)
|
||||
//sleep(100)
|
||||
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
|
||||
@@ -32,11 +32,16 @@ var/datum/roundinfo/roundinfo = new()
|
||||
|
||||
var/pregame_timeleft = 0
|
||||
|
||||
//automated spawning of mice and roaches
|
||||
var/global/spawn_vermin = 1
|
||||
var/spawning_vermin = 0
|
||||
var/list/vermin_spawn_areas
|
||||
|
||||
/datum/controller/gameticker/proc/pregame()
|
||||
login_music = pick('title1.ogg', 'title2.ogg') // choose title music!
|
||||
|
||||
do
|
||||
|
||||
pregame_timeleft = 180
|
||||
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
|
||||
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
|
||||
@@ -49,6 +54,9 @@ var/datum/roundinfo/roundinfo = new()
|
||||
current_state = GAME_STATE_SETTING_UP
|
||||
while (!setup())
|
||||
|
||||
spawn(10)
|
||||
vermin_spawn_areas = list("/area/maintenance","/area/mine/maintenance","/area/crew_quarters/toilet","/area/crew_quarters/locker/locker_toilet")
|
||||
|
||||
/datum/controller/gameticker/proc/setup()
|
||||
//Create and announce mode
|
||||
if(master_mode=="secret")
|
||||
@@ -303,6 +311,37 @@ var/datum/roundinfo/roundinfo = new()
|
||||
while(!going) sleep(10)
|
||||
world.Reboot()
|
||||
|
||||
//randomly spawn vermin in maintenance and other areas
|
||||
if(spawn_vermin && vermin_spawn_areas && vermin_spawn_areas.len)
|
||||
if(!spawning_vermin)
|
||||
spawning_vermin = 1
|
||||
spawn(rand(6000,9000)) //between 10 (6000) and 15 (9000) minutes interval
|
||||
var/area_text = pick(vermin_spawn_areas)
|
||||
area_text = text2path(area_text)
|
||||
var/random_area = pick( typesof(area_text) )
|
||||
var/list/turfs = get_area_turfs(random_area)
|
||||
if(!turfs.len)
|
||||
turfs = get_area_turfs(pick(typesof(pick(vermin_spawn_areas))))
|
||||
//
|
||||
while(turfs.len > 0)
|
||||
var/turf/T = pick(turfs)
|
||||
turfs -= T
|
||||
if(T.density)
|
||||
continue
|
||||
var/bad = 0
|
||||
for(var/obj/I in T)
|
||||
if(I.density)
|
||||
bad = 1
|
||||
break
|
||||
if(bad)
|
||||
continue
|
||||
if(prob(50))
|
||||
new /mob/living/simple_animal/mouse(T)
|
||||
else
|
||||
new /obj/effect/critter/roach(T)
|
||||
break
|
||||
spawning_vermin = 0
|
||||
|
||||
return 1
|
||||
|
||||
proc/getfactionbyname(var/name)
|
||||
|
||||
@@ -310,7 +310,7 @@ datum
|
||||
target = targeta
|
||||
job = joba
|
||||
weight = get_points(job)
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] is a relative of a high ranking Syndicate Leader. Make sure they get off the ship safely, while minimizing intervention."
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] is a [pick("relative of a","friend of a","") + pick("high ranking","important","well-liked")] Syndicate [pick("Leader","Officer","Agent","sympathiser")]. Make sure they get off the station safely, while minimizing intervention."
|
||||
|
||||
check_completion()
|
||||
if(emergency_shuttle.location<2)
|
||||
@@ -354,7 +354,7 @@ datum
|
||||
target = targeta
|
||||
job = joba
|
||||
weight = get_points(job)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]."
|
||||
|
||||
check_completion()
|
||||
if(target && target.current)
|
||||
@@ -393,7 +393,7 @@ datum
|
||||
break
|
||||
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
@@ -411,7 +411,7 @@ datum
|
||||
target = pick(possible_targets)
|
||||
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
@@ -1188,6 +1188,30 @@ datum
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
cash //must be in credits - atm and coins don't count
|
||||
var/steal_amount = 2000
|
||||
explanation_text = "Beg, borrow or steal 2000 credits."
|
||||
weight = 20
|
||||
|
||||
New(var/text,var/joba)
|
||||
..(text,joba)
|
||||
steal_amount = 1250 + rand(0,3750)
|
||||
explanation_text = "Beg, borrow or steal [steal_amount] credits."
|
||||
|
||||
get_points(var/job)
|
||||
return 10 + 25 * round(steal_amount / 5000)
|
||||
|
||||
check_completion()
|
||||
var/held_credits = 0
|
||||
for(var/obj/item/weapon/money/M in owner.current.get_contents())
|
||||
held_credits += M.worth
|
||||
if(held_credits >= steal_amount)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
|
||||
nuclear
|
||||
explanation_text = "Destroy the station with a nuclear device."
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
if("SHADE")
|
||||
var/mob/living/simple_animal/shade/T = target
|
||||
var/obj/item/device/soulstone/C = src
|
||||
if (T.alive == 0)
|
||||
if (T.stat == DEAD)
|
||||
U << "\red <b>Capture failed!</b>: \black The shade has already been banished!"
|
||||
else
|
||||
if(C.contents.len)
|
||||
|
||||
@@ -510,15 +510,15 @@ CRITTER GRENADE
|
||||
deliveryamt = 5
|
||||
origin_tech = "materials=3;magnets=4;syndicate=4"
|
||||
|
||||
/obj/item/weapon/spawnergrenade/spesscarp
|
||||
/obj/item/weapon/spawnergrenade/carp
|
||||
name = "carp delivery grenade"
|
||||
spawner_type = /obj/effect/critter/spesscarp
|
||||
spawner_type = /mob/living/simple_animal/carp
|
||||
deliveryamt = 5
|
||||
origin_tech = "materials=3;magnets=4;syndicate=4"
|
||||
|
||||
/obj/item/weapon/spawnergrenade/elitespesscarp
|
||||
/obj/item/weapon/spawnergrenade/elitecarp
|
||||
name = "elite carp delivery grenade"
|
||||
spawner_type = /obj/effect/critter/spesscarp/elite
|
||||
spawner_type = /mob/living/simple_animal/carp/elite
|
||||
deliveryamt = 2
|
||||
origin_tech = "materials=3;magnets=4;syndicate=4"
|
||||
|
||||
|
||||
@@ -148,6 +148,14 @@
|
||||
affecting.take_damage(1, 0)
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
else if(ismouse(target))
|
||||
var/mob/living/simple_animal/mouse/M = target
|
||||
src.visible_message("\red \icon[src] <b>SPLAT!</b>")
|
||||
M.splat()
|
||||
else if(isroach(target))
|
||||
var/obj/effect/critter/roach/R = target
|
||||
src.visible_message("\red \icon[src] <b>CRUNCH!</b>")
|
||||
R.Die()
|
||||
playsound(target.loc, 'snap.ogg', 50, 1)
|
||||
icon_state = "mousetrap"
|
||||
armed = 0
|
||||
|
||||
@@ -165,12 +165,6 @@ proc/blood_incompatible(donor,receiver)
|
||||
//AB is a universal receiver.
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/rag
|
||||
New() // So I don't have to grab maplock
|
||||
spawn(1)
|
||||
new/obj/item/weapon/reagent_containers/glass/rag(loc)
|
||||
del src
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/rag
|
||||
name = "damp rag"
|
||||
desc = "For cleaning up messes, you suppose."
|
||||
|
||||
@@ -112,20 +112,12 @@ var/global/BSACooldown = 0
|
||||
M.change_mob_type( /mob/living/silicon/robot , null, null, delmob)
|
||||
if("cat")
|
||||
M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob)
|
||||
if("runtime")
|
||||
M.change_mob_type( /mob/living/simple_animal/cat/Runtime , null, null, delmob)
|
||||
if("corgi")
|
||||
M.change_mob_type( /mob/living/simple_animal/corgi , null, null, delmob)
|
||||
if("ian")
|
||||
M.change_mob_type( /mob/living/simple_animal/corgi/Ian , null, null, delmob)
|
||||
if("crab")
|
||||
M.change_mob_type( /mob/living/simple_animal/crab , null, null, delmob)
|
||||
if("coffee")
|
||||
M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob)
|
||||
if("parrot")
|
||||
M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob)
|
||||
if("drprofessor")
|
||||
M.change_mob_type( /mob/living/simple_animal/parrot/DrProfessor , null, null, delmob)
|
||||
if("constructarmoured")
|
||||
M.change_mob_type( /mob/living/simple_animal/constructarmoured , null, null, delmob)
|
||||
if("constructbuilder")
|
||||
@@ -2589,11 +2581,8 @@ var/global/BSACooldown = 0
|
||||
body += "<A href='?src=\ref[src];simplemake=monkey;mob=\ref[M]'>Monkey</A> | "
|
||||
body += "<A href='?src=\ref[src];simplemake=robot;mob=\ref[M]'>Cyborg</A> | "
|
||||
body += "<A href='?src=\ref[src];simplemake=cat;mob=\ref[M]'>Cat</A> | "
|
||||
body += "<A href='?src=\ref[src];simplemake=runtime;mob=\ref[M]'>Runtime</A> | "
|
||||
body += "<A href='?src=\ref[src];simplemake=corgi;mob=\ref[M]'>Corgi</A> | "
|
||||
body += "<A href='?src=\ref[src];simplemake=ian;mob=\ref[M]'>Ian</A> | "
|
||||
body += "<A href='?src=\ref[src];simplemake=crab;mob=\ref[M]'>Crab</A> | "
|
||||
body += "<A href='?src=\ref[src];simplemake=coffee;mob=\ref[M]'>Coffee</A> | "
|
||||
//body += "<A href='?src=\ref[src];simplemake=parrot;mob=\ref[M]'>Parrot</A> | "
|
||||
//body += "<A href='?src=\ref[src];simplemake=drprofessor;mob=\ref[M]'>DrProfessor</A> | "
|
||||
body += "\[ Construct: <A href='?src=\ref[src];simplemake=constructarmoured;mob=\ref[M]'>Armoured</A> , "
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
name = "captain's helmet"
|
||||
icon_state = "capspace"
|
||||
item_state = "capspacehelmet"
|
||||
desc = "A special helmet for the most fashionable of military figureheads."
|
||||
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR
|
||||
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
|
||||
flags = FPRINT | TABLEPASS | HEADSPACE | HEADCOVERSEYES | BLOCKHAIR
|
||||
see_face = 0.0
|
||||
permeability_coefficient = 0.01
|
||||
armor = list(melee = 65, bullet = 50, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 50)
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/captain
|
||||
name = "captain's armor"
|
||||
desc = "A bulky, heavy-duty piece of exclusive NanoTrasen armor. YOU are in charge!"
|
||||
desc = "A bulky, heavy-duty piece of exclusive NanoTrasen armor."
|
||||
icon_state = "caparmor"
|
||||
item_state = "capspacesuit"
|
||||
w_class = 4
|
||||
@@ -19,7 +19,7 @@
|
||||
permeability_coefficient = 0.02
|
||||
heat_transfer_coefficient = 0.02
|
||||
protective_temperature = 1000
|
||||
flags = FPRINT | TABLEPASS
|
||||
flags = FPRINT | TABLEPASS | SUITSPACE
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
|
||||
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
|
||||
slowdown = 1.5
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05
|
||||
|
||||
//todo: merge this with simple_animal?
|
||||
|
||||
/obj/effect/critter
|
||||
name = "Critter"
|
||||
desc = "Generic critter."
|
||||
|
||||
@@ -73,7 +73,7 @@ Contains the procs that control attacking critters
|
||||
|
||||
Die()
|
||||
if (!src.alive) return
|
||||
src.icon_state += "-dead"
|
||||
src.icon_state += "_dead"
|
||||
src.alive = 0
|
||||
src.anchored = 0
|
||||
src.density = 0
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/obj/effect/critter/creature
|
||||
name = "creature"
|
||||
desc = "A sanity-destroying otherthing."
|
||||
@@ -22,25 +23,6 @@
|
||||
attacktext = "chomps"
|
||||
attack_sound = 'bite.ogg'
|
||||
|
||||
|
||||
/obj/effect/critter/roach
|
||||
name = "cockroach"
|
||||
desc = "An unpleasant insect that lives in filthy places."
|
||||
icon_state = "roach"
|
||||
health = 5
|
||||
max_health = 5
|
||||
aggressive = 0
|
||||
defensive = 1
|
||||
wanderer = 1
|
||||
atkcarbon = 1
|
||||
atksilicon = 0
|
||||
attacktext = "bites"
|
||||
|
||||
Die()
|
||||
..()
|
||||
del(src)
|
||||
|
||||
|
||||
/obj/effect/critter/killertomato
|
||||
name = "killer tomato"
|
||||
desc = "Oh shit, you're really fucked now."
|
||||
@@ -55,7 +37,6 @@
|
||||
firevuln = 2
|
||||
brutevuln = 2
|
||||
|
||||
|
||||
Harvest(var/obj/item/weapon/W, var/mob/living/user)
|
||||
if(..())
|
||||
var/success = 0
|
||||
@@ -73,12 +54,11 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/obj/effect/critter/spore
|
||||
name = "plasma spore"
|
||||
desc = "A barely intelligent colony of organisms. Very volatile."
|
||||
icon_state = "spore"
|
||||
icon = 'otherthing.dmi'
|
||||
icon_state = "otherthing"
|
||||
density = 1
|
||||
health = 1
|
||||
max_health = 1
|
||||
@@ -90,7 +70,6 @@
|
||||
firevuln = 2
|
||||
brutevuln = 2
|
||||
|
||||
|
||||
Die()
|
||||
src.visible_message("<b>[src]</b> ruptures and explodes!")
|
||||
src.alive = 0
|
||||
@@ -100,11 +79,9 @@
|
||||
explosion(T, -1, -1, 2, 3)
|
||||
del src
|
||||
|
||||
|
||||
ex_act(severity)
|
||||
src.Die()
|
||||
|
||||
|
||||
/obj/effect/critter/blob
|
||||
name = "blob"
|
||||
desc = "Some blob thing."
|
||||
@@ -129,78 +106,10 @@
|
||||
..()
|
||||
del(src)
|
||||
|
||||
|
||||
|
||||
/obj/effect/critter/spesscarp
|
||||
name = "Spess Carp"
|
||||
desc = "A ferocious, fang-bearing creature that resembles a fish."
|
||||
icon_state = "spesscarp"
|
||||
health = 100
|
||||
max_health = 100
|
||||
aggressive = 1
|
||||
aggression = 20
|
||||
defensive = 1
|
||||
wanderer = 1
|
||||
atkcarbon = 1
|
||||
atksilicon = 1
|
||||
atkcritter = 1
|
||||
atkmech = 1
|
||||
firevuln = 2
|
||||
brutevuln = 1
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
angertext = "lunges"
|
||||
attacktext = "bites"
|
||||
attack_sound = 'bite.ogg'
|
||||
attack_speed = 10
|
||||
speed = 8
|
||||
chasespeed = 8
|
||||
var/stunchance = 10 // chance to tackle things down
|
||||
|
||||
|
||||
Harvest(var/obj/item/weapon/W, var/mob/living/user)
|
||||
if(..())
|
||||
var/success = 0
|
||||
if(istype(W, /obj/item/weapon/butch))
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/carpmeat(src.loc)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/carpmeat(src.loc)
|
||||
success = 1
|
||||
if(istype(W, /obj/item/weapon/kitchenknife))
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/carpmeat(src.loc)
|
||||
success = 1
|
||||
if(success)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red [user.name] cuts apart the [src.name]!", 1)
|
||||
del(src)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
AfterAttack(var/mob/living/target)
|
||||
if(prob(stunchance))
|
||||
if(target.weakened <= 0)
|
||||
target.Weaken(rand(10, 15))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src]</B> knocks down [target]!", 1)
|
||||
playsound(loc, 'pierce.ogg', 25, 1, -1)
|
||||
|
||||
|
||||
|
||||
/obj/effect/critter/spesscarp/elite
|
||||
desc = "Oh shit, you're really fucked now. It has an evil gleam in its eye."
|
||||
health = 200
|
||||
max_health = 200
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 35
|
||||
stunchance = 15
|
||||
attack_speed = 7
|
||||
// opensdoors = 1 would give all access dono if want
|
||||
|
||||
|
||||
|
||||
/obj/effect/critter/walkingmushroom
|
||||
name = "Walking Mushroom"
|
||||
desc = "A...huge...mushroom...with legs!?"
|
||||
icon_state = "walkingmushroom"
|
||||
icon_state = "mushroom"
|
||||
health = 15
|
||||
max_health = 15
|
||||
aggressive = 0
|
||||
@@ -212,7 +121,6 @@
|
||||
brutevuln = 1
|
||||
wanderspeed = 1
|
||||
|
||||
|
||||
Harvest(var/obj/item/weapon/W, var/mob/living/user)
|
||||
if(..())
|
||||
var/success = 0
|
||||
@@ -230,8 +138,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/obj/effect/critter/lizard
|
||||
name = "Lizard"
|
||||
desc = "A cute tiny lizard."
|
||||
@@ -246,7 +152,30 @@
|
||||
atksilicon = 1
|
||||
attacktext = "bites"
|
||||
|
||||
/obj/effect/critter/roach
|
||||
name = "cockroach"
|
||||
desc = "An unpleasant insect that lives in filthy places."
|
||||
icon_state = "roach"
|
||||
health = 5
|
||||
max_health = 5
|
||||
aggressive = 0
|
||||
defensive = 1
|
||||
wanderer = 1
|
||||
atkcarbon = 1
|
||||
atksilicon = 0
|
||||
attacktext = "bites"
|
||||
|
||||
Bump(var/mob/M)
|
||||
if(ishuman(M))
|
||||
Die()
|
||||
|
||||
Die()
|
||||
..()
|
||||
new /obj/effect/decal/cleanable/mucus(src.loc)
|
||||
del(src)
|
||||
|
||||
/proc/isroach(var/obj/O)
|
||||
return istype(O,/obj/effect/critter/roach)
|
||||
|
||||
// We can maybe make these controllable via some console or something
|
||||
/obj/effect/critter/manhack
|
||||
|
||||
@@ -25,48 +25,40 @@
|
||||
P = trim(P)
|
||||
var/path = text2path(P)
|
||||
var/obj/item/Item = new path()
|
||||
if(istype(Item,/obj/item/weapon/card/id))
|
||||
//id card needs to replace the original ID
|
||||
if(M.ckey == "nerezza" && M.real_name == "Asher Spock" && M.mind.role_alt_title && M.mind.role_alt_title != "Emergency Physician")
|
||||
//only spawn ID if asher is joining as an emergency physician
|
||||
ok = 1
|
||||
del(Item)
|
||||
goto skip
|
||||
var/obj/item/weapon/card/id/I = Item
|
||||
for(var/obj/item/weapon/card/id/C in M)
|
||||
//default settings
|
||||
I.name = "[M.real_name]'s ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])"
|
||||
I.registered_name = M.real_name
|
||||
I.access = C.access
|
||||
I.assignment = C.assignment
|
||||
I.over_jumpsuit = C.over_jumpsuit
|
||||
I.blood_type = C.blood_type
|
||||
I.dna_hash = C.dna_hash
|
||||
I.fingerprint_hash = C.fingerprint_hash
|
||||
|
||||
if(istype(M.back,/obj/item/weapon/storage) && M.back:contents.len < M.back:storage_slots) // Try to place it in something on the mob's back first
|
||||
//custom stuff
|
||||
if(M.ckey == "fastler" && M.real_name == "Fastler Greay") //This is a Lifetime ID
|
||||
I.name = "[M.real_name]'s Lifetime ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])"
|
||||
else if(M.ckey == "nerezza" && M.real_name == "Asher Spock") //This is an Odysseus Specialist ID
|
||||
I.name = "[M.real_name]'s Odysseus Specialist ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])"
|
||||
I.access += list(ACCESS_ROBOTICS) //Station-based mecha pilots need this to access the recharge bay.
|
||||
|
||||
//replace old ID
|
||||
del(C)
|
||||
ok = M.equip_if_possible(I, M.slot_wear_id, 0) //if 1, last argument deletes on fail
|
||||
break
|
||||
else if(istype(M.back,/obj/item/weapon/storage) && M.back:contents.len < M.back:storage_slots) // Try to place it in something on the mob's back
|
||||
Item.loc = M.back
|
||||
ok = 1
|
||||
else if(istype(Item,/obj/item/weapon/card/id)) //player wants a custom ID card - only lifetime cards for now (Nerezza: Not anymore! Custom IDs will be handled differently depending on whose it is. Make sure to note what it is.)
|
||||
if(M.ckey == "fastler" && M.real_name == "Fastler Greay") //This is a Lifetime ID
|
||||
var/obj/item/weapon/card/id/I = Item
|
||||
for(var/obj/item/weapon/card/id/C in M)
|
||||
I.registered_name = M.real_name
|
||||
I.name = "[M.real_name]'s Lifetime ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])"
|
||||
I.access = C.access
|
||||
I.assignment = C.assignment
|
||||
I.over_jumpsuit = C.over_jumpsuit
|
||||
I.blood_type = C.blood_type
|
||||
I.dna_hash = C.dna_hash
|
||||
I.fingerprint_hash = C.fingerprint_hash
|
||||
//
|
||||
I.loc = C.loc
|
||||
ok = 1
|
||||
del(C)
|
||||
break
|
||||
if(M.ckey == "nerezza" && M.real_name == "Asher Spock") //This is an Odysseus Specialist ID
|
||||
var/obj/item/weapon/card/id/I = Item
|
||||
if(M.mind.role_alt_title && M.mind.role_alt_title == "Emergency Physician") //Only spawn if the character is an emergency physician.
|
||||
for(var/obj/item/weapon/card/id/C in M)
|
||||
I.registered_name = M.real_name
|
||||
I.name = "[M.real_name]'s Odysseus Specialist ID Card ([M.mind.role_alt_title ? M.mind.role_alt_title : M.mind.assigned_role])"
|
||||
I.access = C.access
|
||||
I.access += list(ACCESS_ROBOTICS) //Station-based mecha pilots need this to access the recharge bay.
|
||||
I.assignment = C.assignment
|
||||
I.over_jumpsuit = C.over_jumpsuit
|
||||
I.blood_type = C.blood_type
|
||||
I.dna_hash = C.dna_hash
|
||||
I.fingerprint_hash = C.fingerprint_hash
|
||||
//
|
||||
I.loc = C.loc
|
||||
ok = 1
|
||||
del(C)
|
||||
break
|
||||
else //Was not the right job position, gotta delete the custom item.
|
||||
ok = 1
|
||||
del(I)
|
||||
|
||||
else
|
||||
for(var/obj/item/weapon/storage/S in M.contents) // Try to place it in any item that can store stuff, on the mob.
|
||||
if (S:len < S:storage_slots)
|
||||
@@ -74,5 +66,6 @@
|
||||
ok = 1
|
||||
break
|
||||
|
||||
skip:
|
||||
if (ok == 0) // Finally, since everything else failed, place it on the ground
|
||||
Item.loc = get_turf(M.loc)
|
||||
@@ -0,0 +1,160 @@
|
||||
#define BEAR_STANCE_IDLE 1
|
||||
#define BEAR_STANCE_ALERT 2
|
||||
#define BEAR_STANCE_ATTACK 3
|
||||
#define BEAR_STANCE_ATTACKING 4
|
||||
#define BEAR_STANCE_TIRED 5
|
||||
|
||||
//Space bears!
|
||||
/mob/living/simple_animal/bear
|
||||
name = "space bear"
|
||||
desc = "RawrRawr!!"
|
||||
icon_state = "bear"
|
||||
icon_living = "bear"
|
||||
icon_dead = "bear_dead"
|
||||
icon_gib = "bear_gib"
|
||||
speak = list("RAWR!","Rawr!","GRR!","Growl!")
|
||||
speak_emote = list("growls", "roars")
|
||||
emote_hear = list("rawrs","grumbles","grawls")
|
||||
emote_see = list("stares ferociously", "stomps")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "pokes the"
|
||||
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 60
|
||||
health = 60
|
||||
|
||||
//Space bears aren't affected by atmos.
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
|
||||
var/stance = BEAR_STANCE_IDLE //Used to determine behavior
|
||||
var/stance_step = 0 //Used to delay checks depending on what stance the bear is in
|
||||
var/mob/living/target_mob //Once the bear enters attack stance, it will try to chase this mob. This it to prevent it changing it's mind between multiple mobs.
|
||||
|
||||
/proc/isbear(var/mob/M)
|
||||
return istype(M, /mob/living/simple_animal/bear)
|
||||
|
||||
/mob/living/simple_animal/bear/Life()
|
||||
..()
|
||||
|
||||
if(!stat)
|
||||
if(loc && istype(loc,/turf/space))
|
||||
icon_state = "bear"
|
||||
else
|
||||
icon_state = "bearfloor"
|
||||
|
||||
switch(stance)
|
||||
if(BEAR_STANCE_IDLE)
|
||||
stop_automated_movement = 0
|
||||
stance_step++
|
||||
if(stance_step > 5)
|
||||
stance_step = 0
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
if(isbear(L)) continue
|
||||
if(!L.stat)
|
||||
emote("stares alertly at [L]")
|
||||
stance = BEAR_STANCE_ALERT
|
||||
break
|
||||
if(BEAR_STANCE_ALERT)
|
||||
stop_automated_movement = 1
|
||||
var/found_mob = 0
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
if(isbear(L)) continue
|
||||
if(!L.stat)
|
||||
stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again.
|
||||
stance_step++
|
||||
found_mob = 1
|
||||
target_mob = L
|
||||
src.dir = get_dir(src,target_mob) //Keep staring at the mob
|
||||
|
||||
if(stance_step in list(1,4,7)) //every 3 ticks
|
||||
var/action = pick( list( "growls at [L]", "stares angrily at [L]", "prepares to attack [L]", "closely watches [L]" ) )
|
||||
if(action)
|
||||
emote(action)
|
||||
break
|
||||
if(!found_mob)
|
||||
stance_step--
|
||||
|
||||
if(stance_step <= -20) //If we have not found a mob for 20-ish ticks, revert to idle mode
|
||||
stance = BEAR_STANCE_IDLE
|
||||
if(stance_step >= 7) //If we have been staring at a mob for 7 ticks,
|
||||
stance = BEAR_STANCE_ATTACK
|
||||
if(BEAR_STANCE_ATTACK) //This one should only be active for one tick,
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
if(target_mob in viewers(7,src))
|
||||
walk_to(src, target_mob, 1, 3)
|
||||
stance = BEAR_STANCE_ATTACKING
|
||||
stance_step = 0
|
||||
if(BEAR_STANCE_ATTACKING)
|
||||
|
||||
stop_automated_movement = 1
|
||||
stance_step++
|
||||
if(!target_mob || target_mob.stat)
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
return
|
||||
if(!(target_mob in viewers(7,src)))
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
target_mob = null
|
||||
return
|
||||
if(get_dist(src, target_mob) <= 1) //Attacking
|
||||
emote( pick( list("slashes at [target_mob]", "bites [target_mob]") ) )
|
||||
|
||||
var/damage = rand(20,30)
|
||||
|
||||
if(ishuman(target_mob))
|
||||
var/mob/living/carbon/human/H = target_mob
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"))
|
||||
else if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
L.adjustBruteLoss(damage)
|
||||
|
||||
if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest
|
||||
emote( "is worn out and needs to rest" )
|
||||
stance = BEAR_STANCE_TIRED
|
||||
stance_step = 0
|
||||
walk(src, 0) //This stops the bear's walking
|
||||
return
|
||||
if(BEAR_STANCE_TIRED)
|
||||
stop_automated_movement = 1
|
||||
stance_step++
|
||||
if(stance_step >= 10) //rests for 10 ticks
|
||||
if(target_mob && target_mob in viewers(7,src))
|
||||
stance = BEAR_STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle.
|
||||
else
|
||||
stance = BEAR_STANCE_IDLE
|
||||
|
||||
|
||||
/mob/living/simple_animal/bear/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(stance != BEAR_STANCE_ATTACK && stance != BEAR_STANCE_ATTACKING)
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 6
|
||||
target_mob = user
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bear/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if(stance != BEAR_STANCE_ATTACK && stance != BEAR_STANCE_ATTACKING)
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 6
|
||||
target_mob = M
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bear/Process_Spacemove(var/check_drift = 0)
|
||||
return //No drifting in space for space bears!
|
||||
@@ -0,0 +1,112 @@
|
||||
#define CARP_STANCE_IDLE 1
|
||||
#define CARP_STANCE_ATTACK 2
|
||||
#define CARP_STANCE_ATTACKING 3
|
||||
|
||||
/mob/living/simple_animal/carp
|
||||
name = "space carp"
|
||||
desc = "A ferocious, fang-bearing creature that resembles a fish."
|
||||
icon_state = "carp"
|
||||
icon_living = "carp"
|
||||
icon_dead = "carp_dead"
|
||||
icon_gib = "carp_gib"
|
||||
speak_chance = 0
|
||||
turns_per_move = 5
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "hits the"
|
||||
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
|
||||
harm_intent_damage = 8
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
attacktext = "bites"
|
||||
attack_sound = 'bite.ogg'
|
||||
|
||||
//Space carp aren't affected by atmos.
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
|
||||
var/stance = CARP_STANCE_IDLE //Used to determine behavior
|
||||
var/stance_step = 0 //Used to delay checks depending on what stance the bear is in
|
||||
var/mob/living/target_mob //Once the bear enters attack stance, it will try to chase this mob. This it to prevent it changing it's mind between multiple mobs.
|
||||
|
||||
/mob/living/simple_animal/carp/elite
|
||||
desc = "A ferocious, fang-bearing creature that resembles a fish. It has an evil gleam in its eye."
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
|
||||
/proc/iscarp(var/mob/M)
|
||||
return istype(M, /mob/living/simple_animal/carp)
|
||||
|
||||
/mob/living/simple_animal/carp/Life()
|
||||
..()
|
||||
|
||||
if(!stat)
|
||||
switch(stance)
|
||||
if(CARP_STANCE_IDLE)
|
||||
stop_automated_movement = 0
|
||||
stance_step++
|
||||
if(stance_step > 5)
|
||||
stance_step = 0
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
if(iscarp(L)) continue
|
||||
if(!L.stat)
|
||||
emote("gnashes at [L]")
|
||||
stance = CARP_STANCE_ATTACK
|
||||
target_mob = L
|
||||
break
|
||||
|
||||
if(CARP_STANCE_ATTACK) //This one should only be active for one tick
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
stance = CARP_STANCE_IDLE
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
if(target_mob in viewers(7,src))
|
||||
walk_to(src, target_mob, 1, 3)
|
||||
stance = CARP_STANCE_ATTACKING
|
||||
stance_step = 0
|
||||
|
||||
if(CARP_STANCE_ATTACKING)
|
||||
stop_automated_movement = 1
|
||||
stance_step++
|
||||
if(!target_mob || target_mob.stat)
|
||||
stance = CARP_STANCE_IDLE
|
||||
stance_step = 3 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
target_mob = null
|
||||
walk(src,0)
|
||||
return
|
||||
if(!(target_mob in viewers(7,src)))
|
||||
stance = CARP_STANCE_IDLE
|
||||
stance_step = 1
|
||||
target_mob = null
|
||||
walk(src,0)
|
||||
return
|
||||
if(get_dist(src, target_mob) <= 1) //Attacking
|
||||
if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
L.attack_animal(src)
|
||||
if(prob(10))
|
||||
L.Weaken(5)
|
||||
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
|
||||
|
||||
|
||||
/mob/living/simple_animal/carp/Die()
|
||||
..()
|
||||
target_mob = null
|
||||
stance = CARP_STANCE_IDLE
|
||||
walk(src,0)
|
||||
|
||||
/mob/living/simple_animal/carp/Process_Spacemove(var/check_drift = 0)
|
||||
return //No drifting in space for space carp! //original comments do not steal
|
||||
@@ -1,8 +1,7 @@
|
||||
//Cat
|
||||
/mob/living/simple_animal/cat
|
||||
name = "cat"
|
||||
desc = "Kitty!!"
|
||||
icon = 'mob.dmi'
|
||||
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
|
||||
icon_state = "cat"
|
||||
icon_living = "cat"
|
||||
icon_dead = "cat_dead"
|
||||
@@ -13,15 +12,48 @@
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "kicks the"
|
||||
var/turns_since_scan = 0
|
||||
var/mob/living/simple_animal/mouse/movement_target
|
||||
|
||||
/mob/living/simple_animal/cat/Life()
|
||||
//MICE!
|
||||
if((src.loc) && isturf(src.loc))
|
||||
if(!stat && !resting && !buckled)
|
||||
for(var/mob/living/simple_animal/mouse/M in view(1,src))
|
||||
if(!M.stat)
|
||||
M.splat()
|
||||
emote("splats \the [M]")
|
||||
movement_target = null
|
||||
stop_automated_movement = 0
|
||||
break
|
||||
|
||||
..()
|
||||
|
||||
if(!stat && !resting && !buckled)
|
||||
turns_since_scan++
|
||||
if(turns_since_scan > 5)
|
||||
walk_to(src,0)
|
||||
turns_since_scan = 0
|
||||
if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) ))
|
||||
movement_target = null
|
||||
stop_automated_movement = 0
|
||||
if( !movement_target || !(movement_target.loc in oview(src, 3)) )
|
||||
movement_target = null
|
||||
stop_automated_movement = 0
|
||||
for(var/mob/living/simple_animal/mouse/snack in oview(src,3))
|
||||
if(isturf(snack.loc) && !snack.stat)
|
||||
movement_target = snack
|
||||
break
|
||||
if(movement_target)
|
||||
stop_automated_movement = 1
|
||||
walk_to(src,movement_target,0,3)
|
||||
|
||||
//RUNTIME IS ALIVE! SQUEEEEEEEE~
|
||||
/mob/living/simple_animal/cat/Runtime
|
||||
name = "Runtime"
|
||||
desc = ""
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
desc = "Its fur has the look and feel of velvet, and it's tail quivers occasionally."
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
name = "\improper corgi"
|
||||
real_name = "corgi"
|
||||
desc = "It's a corgi."
|
||||
icon = 'mob.dmi'
|
||||
icon_state = "corgi"
|
||||
icon_living = "corgi"
|
||||
icon_dead = "corgi_dead"
|
||||
@@ -13,41 +12,16 @@
|
||||
emote_see = list("shakes its head", "shivers")
|
||||
speak_chance = 1
|
||||
turns_per_move = 10
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/corgi
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
|
||||
meat_amount = 3
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_disarm = "bops the"
|
||||
response_harm = "kicks the"
|
||||
see_in_dark = 5
|
||||
var/obj/item/inventory_head
|
||||
var/obj/item/inventory_back
|
||||
var/obj/item/inventory_mouth
|
||||
|
||||
/mob/living/simple_animal/corgi/update_clothing()
|
||||
overlays = list()
|
||||
|
||||
if(inventory_head)
|
||||
var/head_icon_state = inventory_head.icon_state
|
||||
if(health <= 0)
|
||||
head_icon_state += "2"
|
||||
|
||||
var/icon/head_icon = icon('corgi_head.dmi',head_icon_state)
|
||||
if(head_icon)
|
||||
overlays += head_icon
|
||||
|
||||
if(inventory_back)
|
||||
var/back_icon_state = inventory_back.icon_state
|
||||
if(health <= 0)
|
||||
back_icon_state += "2"
|
||||
|
||||
var/icon/back_icon = icon('corgi_back.dmi',back_icon_state)
|
||||
if(back_icon)
|
||||
overlays += back_icon
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/corgi/Life()
|
||||
..()
|
||||
rebuild_appearance()
|
||||
var/turns_since_scan = 0
|
||||
var/obj/movement_target
|
||||
|
||||
/mob/living/simple_animal/corgi/show_inv(mob/user as mob)
|
||||
/*
|
||||
@@ -104,7 +78,6 @@
|
||||
emote_hear = list("barks", "woofs", "yaps","pants")
|
||||
emote_see = list("shakes its head", "shivers")
|
||||
desc = "It's a corgi."
|
||||
src.ul_SetLuminosity(0)
|
||||
inventory_head.loc = src.loc
|
||||
inventory_head = null
|
||||
else
|
||||
@@ -148,7 +121,7 @@
|
||||
/obj/item/clothing/head/caphat,
|
||||
/obj/item/clothing/head/collectable/captain,
|
||||
/obj/item/clothing/head/that,
|
||||
/obj/item/clothing/head/helmet/that,
|
||||
/obj/item/clothing/head/that,
|
||||
/obj/item/clothing/head/kitty,
|
||||
/obj/item/clothing/head/collectable/kitty,
|
||||
/obj/item/clothing/head/rabbitears,
|
||||
@@ -166,13 +139,10 @@
|
||||
/obj/item/clothing/head/wizard/fake,
|
||||
/obj/item/clothing/head/wizard,
|
||||
/obj/item/clothing/head/collectable/wizard,
|
||||
/obj/item/clothing/head/helmet/hardhat,
|
||||
/obj/item/clothing/head/collectable/hardhat,
|
||||
/obj/item/clothing/head/helmet/hardhat/white,
|
||||
/obj/item/weapon/bedsheet,
|
||||
/obj/item/clothing/head/helmet/space/santahat,
|
||||
/obj/item/clothing/head/collectable/paper,
|
||||
/obj/item/clothing/head/cargosoft
|
||||
)
|
||||
|
||||
if( ! ( item_to_add.type in allowed_types ) )
|
||||
@@ -182,6 +152,7 @@
|
||||
usr.drop_item()
|
||||
item_to_add.loc = src
|
||||
src.inventory_head = item_to_add
|
||||
rebuild_appearance()
|
||||
|
||||
//Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a HAT is removed.
|
||||
|
||||
@@ -239,11 +210,6 @@
|
||||
name = "Rudolph the Red-Nosed Corgi"
|
||||
emote_hear = list("barks christmas songs", "yaps")
|
||||
desc = "He has a very shiny nose."
|
||||
src.ul_SetLuminosity(6)
|
||||
if(/obj/item/clothing/head/cargosoft)
|
||||
name = "Corgi Tech [real_name]"
|
||||
speak = list("Needs a stamp!", "Request DENIED!", "Fill these out in triplicate!")
|
||||
desc = "The reason your yellow gloves have chew-marks."
|
||||
|
||||
if("back")
|
||||
if(inventory_back)
|
||||
@@ -269,29 +235,18 @@
|
||||
usr.drop_item()
|
||||
item_to_add.loc = src
|
||||
src.inventory_back = item_to_add
|
||||
update_clothing()
|
||||
rebuild_appearance()
|
||||
|
||||
//show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying.
|
||||
else
|
||||
..()
|
||||
|
||||
//IAN! SQUEEEEEEEEE~
|
||||
/mob/living/simple_animal/corgi/Ian
|
||||
name = "Ian"
|
||||
real_name = "Ian" //Intended to hold the name without altering it.
|
||||
gender = "male"
|
||||
desc = "It's a corgi."
|
||||
var/turns_since_scan = 0
|
||||
var/obj/movement_target
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
|
||||
/mob/living/simple_animal/corgi/Ian/Life()
|
||||
/mob/living/simple_animal/corgi/Life()
|
||||
..()
|
||||
rebuild_appearance()
|
||||
|
||||
//Feeding, chasing food, FOOOOODDDD
|
||||
if(alive && !resting && !buckled)
|
||||
if(!stat && !resting && !buckled)
|
||||
turns_since_scan++
|
||||
if(turns_since_scan > 5)
|
||||
turns_since_scan = 0
|
||||
@@ -338,11 +293,11 @@
|
||||
dir = i
|
||||
sleep(1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/corgi
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/corgi
|
||||
name = "Corgi meat"
|
||||
desc = "Tastes like... well you know..."
|
||||
|
||||
/mob/living/simple_animal/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes)
|
||||
/mob/living/simple_animal/corgi/Bump(atom/movable/AM as mob|obj, yes)
|
||||
|
||||
spawn( 0 )
|
||||
if ((!( yes ) || now_pushing))
|
||||
@@ -350,11 +305,11 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
/* if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(70))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return*/
|
||||
return
|
||||
if(tmob.nopush)
|
||||
now_pushing = 0
|
||||
return
|
||||
@@ -388,7 +343,7 @@
|
||||
|
||||
/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
if(istype(O, /obj/item/weapon/newspaper))
|
||||
if(alive)
|
||||
if(!stat)
|
||||
for(var/mob/M in viewers(user, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\blue [user] baps [name] on the nose with the rolled up [O]")
|
||||
@@ -397,4 +352,14 @@
|
||||
dir = i
|
||||
sleep(1)
|
||||
else
|
||||
..()
|
||||
..()
|
||||
|
||||
//IAN! SQUEEEEEEEEE~
|
||||
/mob/living/simple_animal/corgi/Ian
|
||||
name = "Ian"
|
||||
real_name = "Ian" //Intended to hold the name without altering it.
|
||||
gender = "male"
|
||||
desc = "It's a somewhat notorious corgi."
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "kicks"
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
//Look Sir, free crabs!
|
||||
/mob/living/simple_animal/crab
|
||||
name = "crab"
|
||||
desc = "Free crabs!"
|
||||
icon = 'mob.dmi'
|
||||
desc = "A hard-shelled crustacean. Seems quite content to lounge around all the time."
|
||||
icon_state = "crab"
|
||||
icon_living = "crab"
|
||||
icon_dead = "crab_dead"
|
||||
@@ -11,59 +10,22 @@
|
||||
emote_see = list("clacks")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "stomps the"
|
||||
stop_automated_movement = 1
|
||||
friendly = "pinches"
|
||||
var/obj/item/inventory_head
|
||||
var/obj/item/inventory_mask
|
||||
|
||||
/mob/living/simple_animal/crab/Life()
|
||||
..()
|
||||
//CRAB movement
|
||||
if(!ckey && alive)
|
||||
if(!ckey && !stat)
|
||||
if(isturf(src.loc) && !resting && !buckled) //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)
|
||||
Move(get_step(src,pick(4,8)))
|
||||
turns_since_move = 0
|
||||
|
||||
//COFFEE! SQUEEEEEEEEE!
|
||||
/mob/living/simple_animal/crab/Coffee
|
||||
name = "Coffee"
|
||||
desc = "It's Coffee, the other pet!"
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "stomps"
|
||||
|
||||
//LOOK AT THIS - ..()??
|
||||
/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/weapon/wirecutters))
|
||||
user << "\red \b This kills the crab."
|
||||
health -= 20
|
||||
Die()
|
||||
if(istype(O, /obj/item/stack/medical))
|
||||
if(alive)
|
||||
var/obj/item/stack/medical/MED = O
|
||||
if(health < maxHealth)
|
||||
if(MED.amount >= 1)
|
||||
health = min(maxHealth, health + MED.heal_brute)
|
||||
MED.amount -= 1
|
||||
if(MED.amount <= 0)
|
||||
del(MED)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\blue [user] applies the [MED] on [src]")
|
||||
else
|
||||
user << "\blue this [src] is dead, medical items won't bring it back to life."
|
||||
else
|
||||
if(O.force)
|
||||
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
|
||||
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]. ")
|
||||
rebuild_appearance()
|
||||
|
||||
+3
-5
@@ -20,12 +20,10 @@
|
||||
|
||||
/mob/living/simple_animal/kobold/Life()
|
||||
..()
|
||||
if(prob(15) && turns_since_move)
|
||||
if(prob(15) && turns_since_move && !stat)
|
||||
flick("kobold_act",src)
|
||||
|
||||
/mob/living/simple_animal/kobold/Move(var/dir)
|
||||
..()
|
||||
flick("kobold_walk",src)
|
||||
|
||||
/mob/living/simple_animal/kobold/munchkin
|
||||
name = "Munchkin"
|
||||
if(!stat)
|
||||
flick("kobold_walk",src)
|
||||
@@ -0,0 +1,52 @@
|
||||
/mob/living/simple_animal/mouse
|
||||
name = "mouse"
|
||||
desc = "It's a small, disease-ridden rodent."
|
||||
icon_state = "mouse_gray"
|
||||
icon_living = "mouse_gray"
|
||||
icon_dead = "mouse_gray_dead"
|
||||
speak = list("Squeek!","SQUEEK!","Squeek?")
|
||||
speak_emote = list("squeeks")
|
||||
emote_hear = list("squeeks")
|
||||
emote_see = list("runs in a circle", "shakes", "scritches at something")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
health = 5
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets the"
|
||||
response_disarm = "gently pushes aside the"
|
||||
response_harm = "splats the"
|
||||
density = 0
|
||||
var/color //brown, gray and white
|
||||
|
||||
/mob/living/simple_animal/mouse/Life()
|
||||
..()
|
||||
if(!stat && prob(speak_chance))
|
||||
for(var/mob/M in view())
|
||||
M << "\blue \icon[src] Squeek!"
|
||||
M << 'sound/effects/mousesqueek.ogg'
|
||||
|
||||
/mob/living/simple_animal/mouse/white
|
||||
color = "white"
|
||||
icon_state = "mouse_white"
|
||||
|
||||
/mob/living/simple_animal/mouse/brown
|
||||
color = "brown"
|
||||
icon_state = "mouse_brown"
|
||||
|
||||
/mob/living/simple_animal/mouse/New()
|
||||
if(!color)
|
||||
color = pick( list("brown","gray","white") )
|
||||
icon_state = "mouse_[color]"
|
||||
icon_living = "mouse_[color]"
|
||||
icon_dead = "mouse_[color]_dead"
|
||||
desc = "It's a small, [color], disease-ridden rodent."
|
||||
|
||||
/mob/living/simple_animal/mouse/proc/splat()
|
||||
src.health = 0
|
||||
src.stat = DEAD
|
||||
src.icon_dead = "mouse_[color]_splat"
|
||||
src.icon_state = "mouse_[color]_splat"
|
||||
|
||||
/proc/ismouse(var/obj/O)
|
||||
return istype(O,/mob/living/simple_animal/mouse)
|
||||
@@ -0,0 +1,56 @@
|
||||
/mob/living/simple_animal
|
||||
name = "animal"
|
||||
icon = 'animal.dmi'
|
||||
var/icon_living = ""
|
||||
var/icon_dead = ""
|
||||
var/icon_gib = null //We only try to show a gibbing animation if this exists.
|
||||
maxHealth = 20
|
||||
var/list/speak = list()
|
||||
var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable.
|
||||
var/speak_chance = 0
|
||||
var/list/emote_hear = list() //EHearable emotes
|
||||
var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
|
||||
health = 20
|
||||
var/turns_per_move = 1
|
||||
var/turns_since_move = 0
|
||||
universal_speak = 1
|
||||
var/meat_amount = 0
|
||||
var/meat_type
|
||||
var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
|
||||
var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it.
|
||||
|
||||
//Interaction
|
||||
var/response_help = "You try to help"
|
||||
var/response_disarm = "You try to disarm"
|
||||
var/response_harm = "You try to hurt"
|
||||
var/harm_intent_damage = 3
|
||||
|
||||
//Temperature effect
|
||||
var/minbodytemp = 270
|
||||
var/maxbodytemp = 370
|
||||
var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||
var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||
|
||||
//Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage
|
||||
var/min_oxy = 5
|
||||
var/max_oxy = 0 //Leaving something at 0 means it's off - has no maximum
|
||||
var/min_tox = 0
|
||||
var/max_tox = 1
|
||||
var/min_co2 = 0
|
||||
var/max_co2 = 5
|
||||
var/min_n2 = 0
|
||||
var/max_n2 = 0
|
||||
var/unsuitable_atoms_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
|
||||
|
||||
|
||||
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
|
||||
var/melee_damage_lower = 0
|
||||
var/melee_damage_upper = 0
|
||||
var/attacktext = "attacks"
|
||||
var/attack_sound = null
|
||||
var/friendly = "nuzzles" //If the mob does no damage with it's attack
|
||||
var/wall_smash = 0 //if they can smash walls
|
||||
|
||||
var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
|
||||
|
||||
var/obj/item/device/radio/headset/l_ear = null
|
||||
@@ -0,0 +1,88 @@
|
||||
|
||||
/mob/living/simple_animal/Life()
|
||||
|
||||
//Health
|
||||
if(stat == DEAD)
|
||||
if(health > 0)
|
||||
icon_state = icon_living
|
||||
stat = CONSCIOUS
|
||||
density = 1
|
||||
return
|
||||
else if(health < 1)
|
||||
Die()
|
||||
else if(health > maxHealth)
|
||||
health = maxHealth
|
||||
|
||||
//Movement
|
||||
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)
|
||||
Move(get_step(src,pick(cardinal)))
|
||||
turns_since_move = 0
|
||||
|
||||
//Speaking
|
||||
if(prob(speak_chance))
|
||||
var/length = (speak ? speak.len : 0) + (emote_see ? emote_see.len : 0) + (emote_hear ? emote_hear.len : 0)
|
||||
if(speak && speak.len && prob((speak.len / length) * 100))
|
||||
say(pick(speak))
|
||||
else if(emote_see && emote_see.len && prob((emote_see.len / length) * 100))
|
||||
emote("auto",1,pick(emote_see))
|
||||
else if(emote_hear && emote_hear.len)
|
||||
emote("auto",2,pick(emote_hear))
|
||||
//var/act,var/m_type=1,var/message = null
|
||||
|
||||
//Atmos
|
||||
var/atmos_suitable = 1
|
||||
|
||||
var/atom/A = src.loc
|
||||
if(isturf(A))
|
||||
var/turf/T = A
|
||||
var/areatemp = T.temperature
|
||||
if( abs(areatemp - bodytemperature) > 50 )
|
||||
var/diff = areatemp - bodytemperature
|
||||
diff = diff / 5
|
||||
//world << "changed from [bodytemperature] by [diff] to [bodytemperature + diff]"
|
||||
bodytemperature += diff
|
||||
|
||||
if(istype(T,/turf/simulated))
|
||||
var/turf/simulated/ST = T
|
||||
if(ST.air)
|
||||
var/tox = ST.air.toxins
|
||||
var/oxy = ST.air.oxygen
|
||||
var/n2 = ST.air.nitrogen
|
||||
var/co2 = ST.air.carbon_dioxide
|
||||
|
||||
if(min_oxy)
|
||||
if(oxy < min_oxy)
|
||||
atmos_suitable = 0
|
||||
if(max_oxy)
|
||||
if(oxy > max_oxy)
|
||||
atmos_suitable = 0
|
||||
if(min_tox)
|
||||
if(tox < min_tox)
|
||||
atmos_suitable = 0
|
||||
if(max_tox)
|
||||
if(tox > max_tox)
|
||||
atmos_suitable = 0
|
||||
if(min_n2)
|
||||
if(n2 < min_n2)
|
||||
atmos_suitable = 0
|
||||
if(max_n2)
|
||||
if(n2 > max_n2)
|
||||
atmos_suitable = 0
|
||||
if(min_co2)
|
||||
if(co2 < min_co2)
|
||||
atmos_suitable = 0
|
||||
if(max_co2)
|
||||
if(co2 > max_co2)
|
||||
atmos_suitable = 0
|
||||
|
||||
//Atmos effect
|
||||
if(bodytemperature < minbodytemp)
|
||||
health -= cold_damage_per_tick
|
||||
else if(bodytemperature > maxbodytemp)
|
||||
health -= heat_damage_per_tick
|
||||
|
||||
if(!atmos_suitable)
|
||||
health -= unsuitable_atoms_damage
|
||||
+3
-189
@@ -1,57 +1,4 @@
|
||||
/mob/living/simple_animal
|
||||
name = "animal"
|
||||
var/icon_living = ""
|
||||
var/icon_dead = ""
|
||||
maxHealth = 20
|
||||
var/alive = 1
|
||||
var/list/speak = list()
|
||||
var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable.
|
||||
var/speak_chance = 0
|
||||
var/list/emote_hear = list() //EHearable emotes
|
||||
var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
|
||||
health = 20
|
||||
var/turns_per_move = 1
|
||||
var/turns_since_move = 0
|
||||
universal_speak = 1
|
||||
var/meat_amount = 0
|
||||
var/meat_type
|
||||
var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
|
||||
|
||||
//Interaction
|
||||
var/response_help = "You try to help"
|
||||
var/response_disarm = "You try to disarm"
|
||||
var/response_harm = "You try to hurt"
|
||||
var/harm_intent_damage = 3
|
||||
|
||||
//Temperature effect
|
||||
var/minbodytemp = 270
|
||||
var/maxbodytemp = 370
|
||||
var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||
var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||
|
||||
//Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage
|
||||
var/min_oxy = 5
|
||||
var/max_oxy = 0 //Leaving something at 0 means it's off - has no maximum
|
||||
var/min_tox = 0
|
||||
var/max_tox = 1
|
||||
var/min_co2 = 0
|
||||
var/max_co2 = 5
|
||||
var/min_n2 = 0
|
||||
var/max_n2 = 0
|
||||
var/unsuitable_atoms_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
|
||||
|
||||
|
||||
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
|
||||
var/melee_damage_lower = 0
|
||||
var/melee_damage_upper = 0
|
||||
var/attacktext = "attacks"
|
||||
var/attack_sound = null
|
||||
var/friendly = "nuzzles" //If the mob does no damage with it's attack
|
||||
var/wall_smash = 0 //if they can smash walls
|
||||
|
||||
var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
|
||||
|
||||
var/obj/item/device/radio/headset/l_ear = null
|
||||
/mob/living/simple_animal/New()
|
||||
..()
|
||||
verbs -= /mob/verb/observe
|
||||
@@ -61,137 +8,6 @@
|
||||
src.client.screen = null
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/Life()
|
||||
|
||||
//Health
|
||||
if(!alive)
|
||||
if(health > 0)
|
||||
icon_state = icon_living
|
||||
alive = 1
|
||||
stat = CONSCIOUS
|
||||
density = 1
|
||||
return
|
||||
|
||||
|
||||
if(health < 1)
|
||||
Die()
|
||||
|
||||
if(health > maxHealth)
|
||||
health = maxHealth
|
||||
|
||||
/*
|
||||
// Stun/Weaken
|
||||
|
||||
if (paralysis || stunned || weakened) //Stunned etc.
|
||||
if (stunned > 0)
|
||||
AdjustStunned(-1)
|
||||
stat = 0
|
||||
if (weakened > 0)
|
||||
AdjustWeakened(-1)
|
||||
lying = 1
|
||||
stat = 0
|
||||
if (paralysis > 0)
|
||||
AdjustParalysis(-1)
|
||||
blinded = 1
|
||||
lying = 1
|
||||
stat = 1
|
||||
var/h = hand
|
||||
hand = 0
|
||||
drop_item()
|
||||
hand = 1
|
||||
drop_item()
|
||||
hand = h
|
||||
|
||||
else //Not stunned.
|
||||
lying = 0
|
||||
stat = 0
|
||||
|
||||
if(paralysis || stunned || weakened || buckled)
|
||||
canmove = 0
|
||||
else
|
||||
canmove = 1
|
||||
*/
|
||||
//Movement
|
||||
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)
|
||||
Move(get_step(src,pick(cardinal)))
|
||||
turns_since_move = 0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Speaking
|
||||
if(prob(speak_chance))
|
||||
var/length = speak.len + emote_hear.len + emote_see.len
|
||||
if(speak.len && prob((speak.len / length) * 100))
|
||||
say(pick(speak))
|
||||
else if(emote_see.len && prob((emote_see.len / length) * 100))
|
||||
emote("auto",1,pick(emote_see))
|
||||
else if(emote_hear.len)
|
||||
emote("auto",2,pick(emote_hear))
|
||||
//var/act,var/m_type=1,var/message = null
|
||||
|
||||
|
||||
//Atmos
|
||||
var/atmos_suitable = 1
|
||||
|
||||
var/atom/A = src.loc
|
||||
if(isturf(A))
|
||||
var/turf/T = A
|
||||
var/areatemp = T.temperature
|
||||
if( abs(areatemp - bodytemperature) > 50 )
|
||||
var/diff = areatemp - bodytemperature
|
||||
diff = diff / 5
|
||||
//world << "changed from [bodytemperature] by [diff] to [bodytemperature + diff]"
|
||||
bodytemperature += diff
|
||||
|
||||
if(istype(T,/turf/simulated))
|
||||
var/turf/simulated/ST = T
|
||||
if(ST.air)
|
||||
var/tox = ST.air.toxins
|
||||
var/oxy = ST.air.oxygen
|
||||
var/n2 = ST.air.nitrogen
|
||||
var/co2 = ST.air.carbon_dioxide
|
||||
|
||||
if(min_oxy)
|
||||
if(oxy < min_oxy)
|
||||
atmos_suitable = 0
|
||||
if(max_oxy)
|
||||
if(oxy > max_oxy)
|
||||
atmos_suitable = 0
|
||||
if(min_tox)
|
||||
if(tox < min_tox)
|
||||
atmos_suitable = 0
|
||||
if(max_tox)
|
||||
if(tox > max_tox)
|
||||
atmos_suitable = 0
|
||||
if(min_n2)
|
||||
if(n2 < min_n2)
|
||||
atmos_suitable = 0
|
||||
if(max_n2)
|
||||
if(n2 > max_n2)
|
||||
atmos_suitable = 0
|
||||
if(min_co2)
|
||||
if(co2 < min_co2)
|
||||
atmos_suitable = 0
|
||||
if(max_co2)
|
||||
if(co2 > max_co2)
|
||||
atmos_suitable = 0
|
||||
|
||||
//Atmos effect
|
||||
if(bodytemperature < minbodytemp)
|
||||
health -= cold_damage_per_tick
|
||||
else if(bodytemperature > maxbodytemp)
|
||||
health -= heat_damage_per_tick
|
||||
|
||||
if(!atmos_suitable)
|
||||
health -= unsuitable_atoms_damage
|
||||
|
||||
/mob/living/simple_animal/Bumped(AM as mob|obj)
|
||||
if(!AM) return
|
||||
if(isturf(src.loc) && !resting && !buckled)
|
||||
@@ -217,9 +33,8 @@
|
||||
|
||||
/mob/living/simple_animal/emote(var/act,var/m_type=1,var/message = null)
|
||||
switch(act)
|
||||
|
||||
if ("scream")
|
||||
message = "<B>[src]</B> screams!"
|
||||
message = "<B>[src]</B> makes a loud and pained whimper"
|
||||
m_type = 2
|
||||
|
||||
if ("custom")
|
||||
@@ -332,7 +147,7 @@
|
||||
|
||||
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
if(istype(O, /obj/item/stack/medical))
|
||||
if(alive)
|
||||
if(stat != DEAD)
|
||||
var/obj/item/stack/medical/MED = O
|
||||
if(health < maxHealth)
|
||||
if(MED.amount >= 1)
|
||||
@@ -372,7 +187,6 @@
|
||||
stat(null, "Health: [round((health / maxHealth) * 100)]%")
|
||||
|
||||
/mob/living/simple_animal/proc/Die()
|
||||
alive = 0
|
||||
icon_state = icon_dead
|
||||
stat = DEAD
|
||||
density = 0
|
||||
@@ -391,4 +205,4 @@
|
||||
|
||||
|
||||
if(3.0)
|
||||
health -= 30
|
||||
health -= 30
|
||||
@@ -7,6 +7,7 @@ dopeghoti - Tajaran
|
||||
duntadaman - Skrell
|
||||
fenrisian - Tajaran
|
||||
firefishie - Skrell
|
||||
foolamancer - Skrell
|
||||
forsamori - Tajaran
|
||||
forsamori - Soghun
|
||||
galenus - Soghun
|
||||
@@ -16,6 +17,7 @@ quilan - Tajaran
|
||||
searif - Soghun
|
||||
searif - Tajaran
|
||||
searif - Skrell
|
||||
succubusy - Skrell
|
||||
teddybehr - Soghun
|
||||
spaceman96 - Tajaran
|
||||
spaceman96 - Soghun
|
||||
|
||||
@@ -58,6 +58,14 @@ should be listed in the changelog upon commit though. Thanks. -->
|
||||
|
||||
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
|
||||
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">2 August 2012</h2>
|
||||
<h3 class="author">Cael_Aislinn updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Vermin such as mice and roaches will periodically spawn in maintenance and toilet areas across the station. Cats will hunt the mice, roaches can be stepped on and mousetraps will deal with both.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">10 July 2012</h2>
|
||||
<h3 class="author">Abi79 updated:</h3>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 33 KiB |
+7571
-7572
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Reference in New Issue
Block a user