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:
Kortgstation@gmail.com
2013-02-11 18:23:46 +00:00
parent e289bbf72f
commit 7f7f9059a1
8 changed files with 281 additions and 22 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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")

View File

@@ -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>