mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-25 17:41:56 +00:00
/obj/effects is now /obj/effect. /obj/station_objects is now /obj/structure. Did a bit of minor blob work. The Bay 12 body bags were replaced with closets because having two sets of code that do almost the same thing is silly. Changed back a few of the last jobproc edits as the remove from list before assign was a check to see if the mob was fucked up and if it was remove it so we did not check it again as it would still be fucked up. The medbay/tox monkeys names are random once more. More random name monkeys will help with changeling and clean up the observe/mob menus. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2324 316c924e-a436-60f5-8080-3fe189b3f50e
225 lines
8.2 KiB
Plaintext
225 lines
8.2 KiB
Plaintext
/obj/effect/pressure_plate
|
|
name = "pressure plate"
|
|
desc = "A pressure plate that triggers a trap or a few of them."
|
|
density = 0
|
|
var/list/connected_traps_names = list() //mappers, edit this when you place pressure plates on the map. don't forget to make the connected traps have an UNIQUE name
|
|
var/list/connected_traps = list() //actual references to the connected traps. leave empty, it is generated at runtime from connected_traps_names
|
|
var/trigger_type = "mob and obj" //can be "mob", "obj" or "mob and obj", the only moveable types
|
|
|
|
/obj/effect/pressure_plate/New()
|
|
..()
|
|
src:visibility = 0
|
|
refresh()
|
|
|
|
/obj/effect/pressure_plate/verb/refresh()
|
|
set name = "Refresh Pressure Plate Links"
|
|
set category = "Object"
|
|
set src in view()
|
|
connected_traps = list() //emptying the list first
|
|
for(var/trap_name in connected_traps_names)
|
|
for(var/obj/effect/trap/the_trap in world)
|
|
if(the_trap.name == trap_name)
|
|
connected_traps += the_trap //adding the trap with the matching name
|
|
|
|
/obj/effect/pressure_plate/HasEntered(atom/victim as mob|obj)
|
|
if(victim.density && (trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj))))
|
|
for(var/obj/effect/trap/T in connected_traps)
|
|
T.trigger(victim)
|
|
|
|
/obj/effect/pressure_plate/Bumped(atom/victim as mob|obj)
|
|
if(victim.density && (trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj))))
|
|
for(var/obj/effect/trap/T in connected_traps)
|
|
T.trigger(victim)
|
|
|
|
/obj/effect/trap //has three subtypes - /aoe, /area (ie affects an entire area), /single (only the victim is affected)
|
|
name = "trap"
|
|
desc = "It's a trap!"
|
|
density = 0
|
|
var/uses = 1 //how many times it can be triggered
|
|
var/trigger_type = "mob and obj" //can be "mob", "obj" or "mob and obj", the only moveable types. can also be "none" to not be triggered by entering its square (needs to have a pressure plate attached in that case)
|
|
var/target_type = "mob" //if it targets mobs, turfs or objs
|
|
var/include_dense = 1 //if it includes dense targets in the aoe (may be important for some reason). you'll probably want to change it to 1 if you target mobs or objs
|
|
|
|
/obj/effect/trap/New()
|
|
..()
|
|
src:visibility = 0 //seriously, it keeps saying "undefined var" when I try to do it in the define
|
|
|
|
/obj/effect/trap/HasEntered(victim as mob|obj)
|
|
if(trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj)))
|
|
trigger(victim)
|
|
|
|
/obj/effect/trap/Bumped(victim as mob|obj)
|
|
if(trigger_type == "mob and obj" || (trigger_type == "mob" && istype(victim,/mob)) || (trigger_type == "obj" && istype(victim,/obj)))
|
|
trigger(victim)
|
|
|
|
/obj/effect/trap/proc/trigger(victim)
|
|
if(!uses)
|
|
return
|
|
uses--
|
|
activate(victim)
|
|
|
|
/obj/effect/trap/proc/activate()
|
|
|
|
/obj/effect/trap/aoe
|
|
name = "aoe trap"
|
|
desc = "This trap affects a number of mobs, turfs or objs in an aoe"
|
|
var/aoe_radius = 3 //radius of aoe
|
|
var/aoe_range_or_view = "view" //if it includes all tiles in [radius] range or view
|
|
|
|
/obj/effect/trap/aoe/proc/picktargets()
|
|
|
|
var/list/targets = list()
|
|
|
|
switch(target_type)
|
|
if("turf")
|
|
switch(aoe_range_or_view)
|
|
if("view")
|
|
for(var/turf/T in view(src,aoe_radius))
|
|
if(!T.density || include_dense)
|
|
targets += T
|
|
if("range")
|
|
for(var/turf/T in range(src,aoe_radius))
|
|
if(!T.density || include_dense)
|
|
targets += T
|
|
if("mob")
|
|
switch(aoe_range_or_view)
|
|
if("view")
|
|
for(var/mob/living/M in view(src,aoe_radius))
|
|
if(!M.density || include_dense)
|
|
targets += M
|
|
if("range")
|
|
for(var/mob/living/M in range(src,aoe_radius))
|
|
if(!M.density || include_dense)
|
|
targets += M
|
|
if("obj")
|
|
switch(aoe_range_or_view)
|
|
if("view")
|
|
for(var/obj/O in view(src,aoe_radius))
|
|
if(!O.density || include_dense)
|
|
targets += O
|
|
if("range")
|
|
for(var/obj/O in range(src,aoe_radius))
|
|
if(!O.density || include_dense)
|
|
targets += O
|
|
|
|
return targets
|
|
|
|
/obj/effect/trap/aoe/rocksfall
|
|
name = "rocks fall trap"
|
|
desc = "Your DM must really hate you."
|
|
target_type = "turf"
|
|
include_dense = 0
|
|
var/rocks_amt = 10 //amount of rocks falling
|
|
var/rocks_min_dmg = 50 //min damage per rock
|
|
var/rocks_max_dmg = 100 //max damage per rock
|
|
var/rocks_hit_chance = 100 //the chance for a rock to hit you
|
|
var/list/rocks_type = list() //what rocks might it drop on the target. with var editing, not even limited to rocks.
|
|
|
|
/obj/effect/trap/aoe/rocksfall/New()
|
|
|
|
..()
|
|
|
|
rocks_type = pick_rock_types()
|
|
|
|
/obj/effect/trap/aoe/rocksfall/proc/pick_rock_types() //since we may want subtypes of the trap with completely different rock types, which is best done this way
|
|
|
|
var/list/varieties = list()
|
|
|
|
varieties = typesof(/obj/item/weapon/ore)
|
|
varieties -= /obj/item/weapon/ore/diamond //don't want easily available rare ores, hmm?
|
|
varieties -= /obj/item/weapon/ore/uranium
|
|
varieties -= /obj/item/weapon/ore/slag //that'd be just stupid
|
|
|
|
return varieties
|
|
|
|
/obj/effect/trap/aoe/rocksfall/activate()
|
|
|
|
var/list/targets = list()
|
|
targets = picktargets()
|
|
|
|
if(target_type == "turf")
|
|
for(var/i=0,i<rocks_amt,i++)
|
|
var/turf/hit_loc = pick(targets)
|
|
var/rock_type = pick(rocks_type)
|
|
var/obj/item/weapon/ore/rock = new rock_type(hit_loc)
|
|
for(var/mob/living/M in hit_loc)
|
|
if(prob(rocks_hit_chance))
|
|
M.take_organ_damage(rand(rocks_min_dmg,rocks_max_dmg))
|
|
M << "A chunk of [lowertext(rock.name)] hits you in the head!"
|
|
|
|
if(target_type == "mob")
|
|
for(var/i=0,i<rocks_amt,i++)
|
|
var/mob/living/hit_loc = pick(targets)
|
|
var/rock_type = pick(rocks_type)
|
|
var/obj/item/weapon/ore/rock = new rock_type(hit_loc.loc)
|
|
if(prob(rocks_hit_chance))
|
|
hit_loc.take_organ_damage(rand(rocks_min_dmg,rocks_max_dmg))
|
|
hit_loc << "A chunk of [lowertext(rock.name)] hits you in the head!"
|
|
|
|
/obj/effect/trap/single
|
|
name = "single-target trap"
|
|
desc = "This trap targets a single movable atom, usually the one who triggered it" //usually as in I will code only those ones. if you want to add a different type of targeting, go ahead.
|
|
|
|
/obj/effect/trap/single/rockfalls
|
|
name = "rock falls trap"
|
|
desc = "Your DM must really hate <b>YOU</b>."
|
|
trigger_type = "mob"
|
|
var/rock_min_dmg = 100 //min damage of the rock
|
|
var/rock_max_dmg = 200 //max damage of the rock
|
|
var/rock_hit_chance = 100 //the chance for the rock to hit you
|
|
var/list/rocks_type = list() //what rocks might it drop on the target. with var editing, not even limited to rocks.
|
|
|
|
/obj/effect/trap/single/rockfalls/New()
|
|
|
|
..()
|
|
|
|
rocks_type = pick_rock_types()
|
|
|
|
/obj/effect/trap/single/rockfalls/proc/pick_rock_types() //since we may want subtypes of the trap with completely different rock types, which is best done this way
|
|
|
|
var/list/varieties = list()
|
|
|
|
varieties = typesof(/obj/item/weapon/ore)
|
|
varieties -= /obj/item/weapon/ore/diamond //don't want easily available rare ores, hmm?
|
|
varieties -= /obj/item/weapon/ore/uranium
|
|
varieties -= /obj/item/weapon/ore/slag //that'd be just stupid
|
|
|
|
return varieties
|
|
|
|
/obj/effect/trap/single/rockfalls/activate(mob/living/victim)
|
|
var/rock_type = pick(rocks_type)
|
|
var/obj/item/weapon/ore/rock = new rock_type(victim:loc)
|
|
if (istype(victim) && prob(rock_hit_chance))
|
|
var/dmg = rand(rock_min_dmg,rock_max_dmg)
|
|
if(istype(victim, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = victim
|
|
var/datum/organ/external/affecting = H.organs["head"]
|
|
affecting.take_damage(dmg)
|
|
H.updatehealth()
|
|
else
|
|
victim.take_organ_damage(dmg)
|
|
victim << "A chunk of [lowertext(rock.name)] hits you in the head!"
|
|
|
|
/obj/effect/trap/area
|
|
name = "area trap"
|
|
desc = "This trap targets all atoms of the target_type in its area"
|
|
|
|
/obj/effect/trap/area/proc/pick_targets() //src.loc.loc should be the area
|
|
|
|
var/list/targets = list()
|
|
|
|
switch(target_type)
|
|
if("turf")
|
|
for(var/turf/T in src.loc.loc)
|
|
if(!T.density || include_dense)
|
|
targets += T
|
|
if("mob")
|
|
for(var/mob/living/M in src.loc.loc)
|
|
if(!M.density || include_dense)
|
|
targets += M
|
|
if("obj")
|
|
for(var/obj/O in src.loc.loc)
|
|
if(!O.density || include_dense)
|
|
targets += O
|
|
|
|
return targets |