mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Committed SuperSayu's grenade assemblies patch (with slime core functionality).
Thread is here http://forums.nanotrasen.com/viewtopic.php?f=16&t=12109 Updated the changelog. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5688 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -11,36 +11,154 @@
|
||||
var/list/beakers = new/list()
|
||||
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
|
||||
var/affected_area = 3
|
||||
var/obj/item/device/assembly/trigger = null // Grenade assemblies by Sayu
|
||||
|
||||
New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
verbs -= /obj/item/weapon/grenade/chem_grenade/verb/rotate // only used for infrared beam grenades
|
||||
|
||||
// When constructing a grenade in code rather than by hand
|
||||
// Pass in the path to an assembly -Sayu
|
||||
proc/CreateDefaultTrigger(var/type)
|
||||
if(!ispath(type,/obj/item/device/assembly) || (type in list(/obj/item/device/assembly,/obj/item/device/assembly/igniter)))
|
||||
return
|
||||
if(trigger) del trigger
|
||||
if(type == /obj/item/device/assembly/signaler) type = /obj/item/device/assembly/signaler/reciever
|
||||
if(type == /obj/item/device/assembly/infra)
|
||||
verbs += /obj/item/weapon/grenade/chem_grenade/verb/rotate
|
||||
|
||||
trigger = new type(src)
|
||||
if(!trigger.secured) // some assemblies require this
|
||||
trigger.toggle_secure() // so they can add themselves to processing_objects()
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
if(stage > 1)
|
||||
..()
|
||||
if(stage > 1 && !active && trigger)
|
||||
if(clown_check(user))
|
||||
trigger.activate()
|
||||
user << "<span class='warning'>You prime the [name]! [trigger.describe()]</span>"
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)//TODO:Have grenades use the new assembly things
|
||||
active = 1
|
||||
icon_state = initial(icon_state) + "_active"
|
||||
add_fingerprint(user)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.throw_mode_on()
|
||||
|
||||
HasEntered(AM as mob|obj)
|
||||
if(trigger && trigger.secured)
|
||||
trigger.HasEntered(AM)
|
||||
|
||||
HasProximity(atom/movable/AM as mob|obj)
|
||||
if(trigger && trigger.secured)
|
||||
trigger.HasProximity(AM)
|
||||
|
||||
examine()
|
||||
set src in usr
|
||||
usr << desc
|
||||
if(trigger)
|
||||
if(trigger.secured)
|
||||
usr << trigger.describe()
|
||||
else
|
||||
usr << "The [trigger] is not properly secured."
|
||||
if(/obj/item/weapon/grenade/chem_grenade/verb/rotate in verbs)
|
||||
usr << "The sensor is rigged to face [dir2text(dir)]"
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if(istype(W,/obj/item/device/assembly_holder) && !stage && path != 2)
|
||||
|
||||
var/obj/item/device/assembly/igniter/I = locate() in W
|
||||
|
||||
if(!I)
|
||||
user << "You need an igniter if you're going to make any sort of bomb!"
|
||||
return
|
||||
|
||||
I.loc = src // make the igniter no longer [in W]
|
||||
trigger = locate() in W // should be one other assembly
|
||||
|
||||
if(!trigger)
|
||||
warning("Could not find trigger assembly in assembly holder: [W]")
|
||||
user << "You attempt to fit the [W] to the [src], but fail. It seems something is wrong with the [W]."
|
||||
I.loc = W
|
||||
trigger = null
|
||||
return
|
||||
|
||||
//If you add a new assembly, create a new effective grenade type here
|
||||
//If you don't, grenade construction will fail.
|
||||
switch(trigger.type)
|
||||
if(/obj/item/device/assembly/infra)
|
||||
name = "unsecured tripwire mine"
|
||||
desc = "A grenade casing with an infrared tripwire assembly."
|
||||
verbs += /obj/item/weapon/grenade/chem_grenade/verb/rotate
|
||||
if(/obj/item/device/assembly/mousetrap,/obj/item/device/assembly/mousetrap/armed)
|
||||
name = "unsecured contact mine"
|
||||
desc = "A grenade casing with a pressure switch assembly."
|
||||
var/obj/item/device/assembly/mousetrap/M = trigger
|
||||
M.armed = 0 // Make it safe
|
||||
if(/obj/item/device/assembly/prox_sensor)
|
||||
name = "unsecured proximity mine"
|
||||
desc = "A grenade casing with a short-range sensor assembly."
|
||||
if(/obj/item/device/assembly/signaler)
|
||||
name = "unsecured remote mine"
|
||||
desc = "A grenade casing with a radio tranciever assembly."
|
||||
var/obj/item/device/assembly/signaler/reciever/R = new (src)
|
||||
var/obj/item/device/assembly/signaler/S = trigger
|
||||
R.frequency = S.frequency
|
||||
R.code = S.code
|
||||
trigger = R
|
||||
del S
|
||||
if(/obj/item/device/assembly/timer)
|
||||
name = "unsecured grenade"
|
||||
desc = "A grenade casing with a timer assembly."
|
||||
else
|
||||
user << "You need some sort of trigger mechanism!"
|
||||
I.loc = W
|
||||
trigger = null
|
||||
return // Cancel construction
|
||||
|
||||
trigger.loc = src // Take the trigger mechanism for safe keeping
|
||||
|
||||
del I // The igniter assembly doesn't *actually* do anything
|
||||
del W // The assembly holder is no longer needed
|
||||
|
||||
icon_state = initial(icon_state) +"_ass"
|
||||
stage = 1
|
||||
path = 1
|
||||
user << "\blue You add [W] to the metal casing."
|
||||
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3)
|
||||
del(W) //Okay so we're not really adding anything here. cheating.
|
||||
icon_state = initial(icon_state) +"_ass"
|
||||
name = "unsecured grenade"
|
||||
stage = 1
|
||||
|
||||
else if(istype(W,/obj/item/device/multitool) && trigger && trigger.secured)
|
||||
trigger.interact(user) // Set trigger options
|
||||
|
||||
else if(istype(W,/obj/item/weapon/screwdriver) && stage == 1 && path != 2)
|
||||
path = 1
|
||||
if(beakers.len)
|
||||
switch(trigger.type)
|
||||
if(/obj/item/device/assembly/infra)
|
||||
name = "tripwire mine"
|
||||
if(/obj/item/device/assembly/mousetrap,/obj/item/device/assembly/mousetrap/armed)
|
||||
name = "contact mine"
|
||||
if(/obj/item/device/assembly/prox_sensor)
|
||||
name = "proximity mine"
|
||||
if(/obj/item/device/assembly/signaler/reciever)
|
||||
name = "remote mine"
|
||||
if(/obj/item/device/assembly/timer)
|
||||
name = "grenade"
|
||||
else
|
||||
warning("Bad trigger in grenade during final construction: [trigger]")
|
||||
|
||||
if(!trigger.secured)
|
||||
trigger.toggle_secure() // Necessary for some assemblies
|
||||
|
||||
user << "\blue You lock the assembly."
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
|
||||
name = "grenade"
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
stage = 2
|
||||
else
|
||||
user << "\red You need to add at least one beaker before locking the assembly."
|
||||
|
||||
else if(is_type_in_list(W, allowed_containers) && stage == 1 && path != 2)
|
||||
path = 1
|
||||
if(beakers.len == 2)
|
||||
@@ -91,13 +209,77 @@
|
||||
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
|
||||
G.loc = get_turf(src.loc)*/
|
||||
|
||||
//This hack is necessary for infrared beam grenades.
|
||||
//That said, you don't come across infrared sensors much...
|
||||
verb/rotate()
|
||||
set name = "Rotate Grenade"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
|
||||
dir = turn(dir, 90)
|
||||
usr << "The grenade is now facing [dir2text(dir)]"
|
||||
trigger.dir = dir
|
||||
return
|
||||
|
||||
// Large chem grenades accept slime cores and use the appropriately.
|
||||
/obj/item/weapon/grenade/chem_grenade/large
|
||||
name = "Large Chem Grenade"
|
||||
desc = "An oversized grenade that affects a larger area."
|
||||
icon_state = "large_grenade"
|
||||
allowed_containers = list(/obj/item/weapon/reagent_containers/glass)
|
||||
allowed_containers = list(/obj/item/weapon/reagent_containers/glass,/obj/item/weapon/reagent_containers/food/condiment,
|
||||
/obj/item/weapon/reagent_containers/food/drinks, /obj/item/slime_extract)
|
||||
origin_tech = "combat=3;materials=3"
|
||||
affected_area = 4
|
||||
prime()
|
||||
if(stage < 2)
|
||||
return // Signaller on an incomplete grenade, probably
|
||||
|
||||
var/has_reagents = 0
|
||||
var/obj/item/slime_extract/valid_core = null
|
||||
|
||||
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
|
||||
if(!istype(G)) continue
|
||||
if(G.reagents.total_volume) has_reagents = 1
|
||||
for(var/obj/item/slime_extract/E in beakers)
|
||||
if(!istype(E)) continue
|
||||
if(E.Uses) valid_core = E
|
||||
if(E.reagents.total_volume) has_reagents = 1
|
||||
|
||||
if(!has_reagents)
|
||||
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 50, 1)
|
||||
state = 0
|
||||
if(trigger)
|
||||
trigger.toggle_secure()
|
||||
return
|
||||
|
||||
playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1)
|
||||
|
||||
if(valid_core)
|
||||
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
|
||||
G.reagents.trans_to(valid_core, G.reagents.total_volume)
|
||||
|
||||
// If there is still a core (sometimes it's used up)
|
||||
// and there are reagents left, behave normally
|
||||
|
||||
if(valid_core && valid_core.reagents && valid_core.reagents.total_volume)
|
||||
valid_core.reagents.trans_to(src,valid_core.reagents.total_volume)
|
||||
else
|
||||
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
|
||||
G.reagents.trans_to(src, G.reagents.total_volume)
|
||||
|
||||
if(src.reagents.total_volume) //The possible reactions didnt use up all reagents.
|
||||
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
|
||||
steam.set_up(10, 0, get_turf(src))
|
||||
steam.attach(src)
|
||||
steam.start()
|
||||
|
||||
for(var/atom/A in view(affected_area, src.loc))
|
||||
if( A == src ) continue
|
||||
src.reagents.reaction(A, 1, 10)
|
||||
|
||||
invisibility = INVISIBILITY_MAXIMUM //Why am i doing this?
|
||||
spawn(50) //To make sure all reagents can work
|
||||
del(src) //correctly before deleting the grenade.
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/metalfoam
|
||||
name = "Metal-Foam Grenade"
|
||||
@@ -118,6 +300,8 @@
|
||||
beakers += B2
|
||||
icon_state = "grenade"
|
||||
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/timer)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/incendiary
|
||||
name = "Incendiary Grenade"
|
||||
desc = "Used for clearing rooms of living things."
|
||||
@@ -137,6 +321,8 @@
|
||||
beakers += B2
|
||||
icon_state = "grenade"
|
||||
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/timer)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/antiweed
|
||||
name = "weedkiller grenade"
|
||||
desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents."
|
||||
@@ -157,6 +343,8 @@
|
||||
beakers += B2
|
||||
icon_state = "grenade"
|
||||
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/timer)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/cleaner
|
||||
name = "Cleaner Grenade"
|
||||
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
|
||||
@@ -175,3 +363,5 @@
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = "grenade"
|
||||
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/timer)
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
interact(mob/user as mob) //Called when attack_self is called
|
||||
return
|
||||
|
||||
proc/describe() // Called by grenades to describe the state of the trigger (time left, etc)
|
||||
return "The trigger assembly looks broken!"
|
||||
|
||||
process_cooldown()
|
||||
cooldown--
|
||||
@@ -71,6 +73,10 @@
|
||||
holder.process_activation(src, 1, 0)
|
||||
if(holder && (wires & WIRE_PULSE_SPECIAL))
|
||||
holder.process_activation(src, 0, 1)
|
||||
|
||||
if(istype(loc,/obj/item/weapon/grenade)) // This is a hack. Todo: Manage this better -Sayu
|
||||
var/obj/item/weapon/grenade/G = loc
|
||||
G.prime() // Adios, muchachos
|
||||
// if(radio && (wires & WIRE_RADIO_PULSE))
|
||||
//Not sure what goes here quite yet send signal?
|
||||
return 1
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
proc
|
||||
trigger_beam()
|
||||
|
||||
describe()
|
||||
return "The infrared trigger is [on?"on":"off"]."
|
||||
|
||||
activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
@@ -55,9 +57,16 @@
|
||||
if(first)
|
||||
del(first)
|
||||
return
|
||||
|
||||
if((!(first) && (secured && (istype(loc, /turf) || (holder && istype(holder.loc, /turf))))))
|
||||
var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam((holder ? holder.loc : loc) )
|
||||
if(first || !secured) return
|
||||
var/turf/T = null
|
||||
if(istype(loc,/turf))
|
||||
T = loc
|
||||
else if (holder && istype(holder.loc,/turf))
|
||||
T = holder.loc
|
||||
else if(istype(loc,/obj/item/weapon/grenade) && istype(loc.loc,/turf))
|
||||
T = loc.loc
|
||||
if(T)
|
||||
var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T)
|
||||
I.master = src
|
||||
I.density = 1
|
||||
I.dir = dir
|
||||
|
||||
@@ -13,6 +13,22 @@
|
||||
if(armed)
|
||||
usr << "It looks like it's armed."
|
||||
|
||||
activate()
|
||||
if(..())
|
||||
armed = !armed
|
||||
if(!armed)
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
|
||||
user << "Your hand slips, setting off the trigger."
|
||||
pulse(0)
|
||||
update_icon()
|
||||
if(usr)
|
||||
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
|
||||
|
||||
describe()
|
||||
return "The pressure switch is [armed?"primed":"safe"]."
|
||||
|
||||
update_icon()
|
||||
if(armed)
|
||||
icon_state = "mousetraparmed"
|
||||
@@ -81,7 +97,7 @@
|
||||
..()
|
||||
|
||||
|
||||
HasEntered(AM as mob|obj)
|
||||
HasEntered(var/atom/movable/AM as mob|obj)
|
||||
if(armed)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/H = AM
|
||||
@@ -89,7 +105,9 @@
|
||||
triggered(H)
|
||||
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
|
||||
"<span class='warning'>You accidentally step on [src]</span>")
|
||||
if(ismouse(AM))
|
||||
else if(ismouse(AM))
|
||||
triggered(AM)
|
||||
else if(AM.density) // For mousetrap grenades, set off by anything heavy
|
||||
triggered(AM)
|
||||
..()
|
||||
|
||||
@@ -112,4 +130,4 @@
|
||||
|
||||
/obj/item/device/assembly/mousetrap/armed
|
||||
icon_state = "mousetraparmed"
|
||||
armed = 1
|
||||
armed = 1
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
toggle_scan()
|
||||
sense()
|
||||
|
||||
describe()
|
||||
if(timing)
|
||||
return "\blue The proximity sensor is arming."
|
||||
return "The proximity sensor is [scanning?"armed":"disarmed"]."
|
||||
|
||||
activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
|
||||
@@ -126,9 +126,8 @@
|
||||
pulse(var/radio = 0)
|
||||
if(src.connected && src.wires)
|
||||
connected.Pulse(src)
|
||||
else if(holder)
|
||||
holder.process_activation(src, 1, 0)
|
||||
return 1
|
||||
else
|
||||
return ..(radio)
|
||||
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
@@ -151,3 +150,23 @@
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
|
||||
return
|
||||
|
||||
// Embedded signaller used in grenade construction.
|
||||
// It's necessary because the signaler doens't have an off state.
|
||||
// Generated during grenade construction. -Sayu
|
||||
/obj/item/device/assembly/signaler/reciever
|
||||
var/on = 0
|
||||
|
||||
proc/toggle_safety()
|
||||
on = !on
|
||||
|
||||
activate()
|
||||
toggle_safety()
|
||||
return 1
|
||||
|
||||
describe()
|
||||
return "The radio reciever is [on?"on":"off"]."
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
if(!on) return
|
||||
return ..(signal)
|
||||
|
||||
@@ -10,11 +10,15 @@
|
||||
secured = 0
|
||||
|
||||
var/timing = 0
|
||||
var/time = 10
|
||||
var/time = 5
|
||||
|
||||
proc
|
||||
timer_end()
|
||||
|
||||
describe()
|
||||
if(timing)
|
||||
return "The timer is counting down from [time]!"
|
||||
return "The timer is set for [time] seconds."
|
||||
|
||||
activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
@@ -50,7 +54,7 @@
|
||||
if(timing && time <= 0)
|
||||
timing = 0
|
||||
timer_end()
|
||||
time = 10
|
||||
time = initial(time)
|
||||
return
|
||||
|
||||
|
||||
@@ -93,7 +97,7 @@
|
||||
if(href_list["tp"])
|
||||
var/tp = text2num(href_list["tp"])
|
||||
time += tp
|
||||
time = min(max(round(time), 0), 600)
|
||||
time = min(max(round(time), 1), 600)
|
||||
|
||||
if(href_list["close"])
|
||||
usr << browse(null, "window=timer")
|
||||
|
||||
@@ -57,7 +57,16 @@ should be listed in the changelog upon commit tho. Thanks. -->
|
||||
</div>
|
||||
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">07 Feburary 2012</h2>
|
||||
<h2 class="date">11 February 2013</h2>
|
||||
<h3 class="author">SuperSayu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Signallers, prox sensors, mouse traps and infrared beams can now be attacheed to grenades to create a variety of mines.</li>
|
||||
<li class="rscadd">A slime core can be placed in a large grenade in place of a beaker. When the grenade goes off, the chemicals from the second container will be transfered to the slime core, triggering the usual reaction.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">07 February 2012</h2>
|
||||
<h3 class="author">Giacom updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">The return of the Nanotrasen Scripting Language! (NTSL) If you haven't heard of NTSL, it is a scripting language within a game for telecomms. Yes, you can create scripts to interact with the radio! For more information, head here: http://wiki.nanotrasen.com/index.php?title=NT_Script But before you do, if you are not an antag, do not create bad scripts which hinders communication.</li>
|
||||
|
||||
Reference in New Issue
Block a user