Bomberman Update

- Added a new trait to cameras: Hardened. Hardened is a modifier to the chance a camera will be affected by an EMP. By default, all cameras are affected 100% of the time by a full strength EMP. Will add some hardening to existing cameras once some pending map changes get finished.
- New R&D Invention: LARGE GRENADES. You can now put basically any container (except blender jugs) into it and they affect a larger area. Want a 100 x 100 unit grenade? You now can! The basic casings are made in a protolathe (Materials 3, Combat 3). Unless you've developed them a lot, you'll occasionally get duds (which just spits out the beakers). Duds can be deconstructed in the DA to improve reliability.
- On a related note, an unintended side effect of making large beakers hold more has been fixed.
- Constructible frames, after the circuit board has been inserted, can be right-click/examined to reveal what parts it needs to be finished.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1146 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
morikou@gmail.com
2011-02-28 23:18:46 +00:00
parent 7006025410
commit fafe58190a
9 changed files with 118 additions and 77 deletions
+79 -52
View File
@@ -4,8 +4,8 @@
///////////////////////////////Grenades
/obj/item/weapon/chem_grenade
name = "metal casing"
icon_state = "chemg1"
name = "grenade"
icon_state = "chemg"
icon = 'chemical.dmi'
item_state = "flashbang"
w_class = 2.0
@@ -13,10 +13,12 @@
var/stage = 0
var/state = 0
var/list/beakers = new/list()
var/list/allowed_containers = list("/obj/item/weapon/reagent_containers/glass/beaker", "/obj/item/weapon/reagent_containers/glass/dispenser")
var/list/disallowed_container = "/obj/item/weapon/reagent_containers/glass/large"
var/affected_area = 3
throw_speed = 4
throw_range = 20
flags = FPRINT | TABLEPASS | CONDUCT | ONBELT | USEDELAY
New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
@@ -27,54 +29,65 @@
user << "\blue You add [W] to the metal casing."
playsound(src.loc, 'Screwdriver2.ogg', 25, -3)
del(W) //Okay so we're not really adding anything here. cheating.
icon_state = "chemg2"
name = "unsecured grenade"
icon_state = initial(icon_state)+"_ass"
stage = 1
else if(istype(W,/obj/item/weapon/screwdriver) && stage == 1)
if(beakers.len)
user << "\blue You lock the assembly."
playsound(src.loc, 'Screwdriver.ogg', 25, -3)
name = "grenade"
icon_state = "chemg3"
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 ((istype(W,/obj/item/weapon/reagent_containers/glass/beaker) || istype(W, /obj/item/weapon/reagent_containers/glass/dispenser)) && stage == 1)
if(beakers.len == 2)
user << "\red The grenade can not hold more containers."
return
else
if(W.reagents.total_volume)
user << "\blue You add \the [W] to the assembly."
user.drop_item()
W.loc = src
beakers += W
else
var/found = 0
for(var/container_type in allowed_containers)
if(istype(W, text2path(container_type)))
found = 1
break
if(disallowed_container)
if(istype(W, disallowed_container))
return
if(found)
if(beakers.len == 2)
user << "\red The grenade can not hold more containers."
return
else
user << "\red \the [W] is empty."
if(W.reagents.total_volume)
user << "\blue You add \the [W] to the assembly."
user.drop_item()
W.loc = src
beakers += W
else
user << "\red \the [W] is empty."
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
if (istype(target, /obj/item/weapon/storage)) return ..()
if (!src.state && stage == 2)
if (!src.state && stage == 2 && !crit_fail)
user << "\red You prime the grenade! 3 seconds!"
message_admins("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
src.state = 1
src.icon_state = "chemg4"
src.icon_state = initial(icon_state)+"_armed"
playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
spawn(30)
explode()
user.drop_item()
var/t = (isturf(target) ? target : target.loc)
walk_towards(src, t, 3)
else if(crit_fail)
user << "\red This grenade is a dud and unusable!"
attack_self(mob/user as mob)
if (!src.state && stage == 2)
if (!src.state && stage == 2 && !crit_fail)
user << "\red You prime the grenade! 3 seconds!"
message_admins("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
src.state = 1
src.icon_state = "chemg4"
src.icon_state = initial(icon_state)+"_armed"
playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
spawn(30)
explode()
else if(crit_fail)
user << "\red This grenade is a dud and unusable!"
attack_hand()
walk(src,0)
@@ -84,46 +97,59 @@
proc
explode()
var/has_reagents = 0
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
if(G.reagents.total_volume) has_reagents = 1
if(reliability)
var/has_reagents = 0
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
if(G.reagents.total_volume) has_reagents = 1
if(!has_reagents)
playsound(src.loc, 'Screwdriver2.ogg', 50, 1)
state = 0
return
if(!has_reagents)
playsound(src.loc, 'Screwdriver2.ogg', 50, 1)
state = 0
return
playsound(src.loc, 'bamf.ogg', 50, 1)
playsound(src.loc, 'bamf.ogg', 50, 1)
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
G.reagents.trans_to(src, G.reagents.total_volume)
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/effects/system/steam_spread/steam = new /datum/effects/system/steam_spread()
steam.set_up(10, 0, get_turf(src))
steam.attach(src)
steam.start()
if(src.reagents.total_volume) //The possible reactions didnt use up all reagents.
var/datum/effects/system/steam_spread/steam = new /datum/effects/system/steam_spread()
steam.set_up(10, 0, get_turf(src))
steam.attach(src)
steam.start()
for(var/atom/A in view(3, src.loc))
if( A == src ) continue
src.reagents.reaction(A, 1, 10)
for(var/atom/A in view(affected_area, src.loc))
if( A == src ) continue
src.reagents.reaction(A, 1, 10)
invisibility = 100 //Why am i doing this?
spawn(50) //To make sure all reagents can work
del(src) //correctly before deleting the grenade.
invisibility = 100 //Why am i doing this?
spawn(50) //To make sure all reagents can work
del(src) //correctly before deleting the grenade.
else
icon_state = initial(icon_state) + "_locked"
crit_fail = 1
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
G.loc = get_turf(src.loc)
/obj/item/weapon/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")
disallowed_container = "/obj/item/weapon/reagent_containers/glass/blender_jug"
origin_tech = "combat=3;materials=3"
affected_area = 4
/obj/item/weapon/chem_grenade/metalfoam
name = "Metal-Foam Grenade"
desc = "Used for emergency sealing of air breaches."
icon_state = "chemg3"
stage = 2
New()
..()
var/obj/item/weapon/reagent_containers/glass/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/B2 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
B1.reagents.add_reagent("aluminium", 30)
B2.reagents.add_reagent("foaming_agent", 10)
@@ -131,17 +157,17 @@
beakers += B1
beakers += B2
icon_state = "chemg_locked"
/obj/item/weapon/chem_grenade/incendiary
name = "Incendiary Grenade"
desc = "Used for clearing rooms of living things."
icon_state = "chemg3"
stage = 2
New()
..()
var/obj/item/weapon/reagent_containers/glass/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/B2 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
B1.reagents.add_reagent("aluminium", 25)
B2.reagents.add_reagent("plasma", 25)
@@ -149,17 +175,17 @@
beakers += B1
beakers += B2
icon_state = "chemg_locked"
/obj/item/weapon/chem_grenade/cleaner
name = "Cleaner Grenade"
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
icon_state = "chemg3"
stage = 2
New()
..()
var/obj/item/weapon/reagent_containers/glass/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/B2 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
B1.reagents.add_reagent("fluorosurfactant", 30)
B2.reagents.add_reagent("water", 10)
@@ -167,6 +193,7 @@
beakers += B1
beakers += B2
icon_state = "chemg_locked"
/*
/obj/item/weapon/chem_grenade/poo
name = "poo grenade"
+1 -1
View File
@@ -64,11 +64,11 @@
anchored = 1.0
var/invuln = null
var/bugged = 0
var/hardened = 0
use_power = 2
idle_power_usage = 5
active_power_usage = 10
/obj/machinery/dispenser
desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks."
name = "Tank Storage Unit"
+19 -18
View File
@@ -232,24 +232,25 @@
return
/obj/machinery/camera/emp_act(severity)
icon_state = "cameraemp"
network = null //Not the best way but it will do. I think.
spawn(900)
network = initial(network)
icon_state = initial(icon_state)
for(var/mob/living/silicon/ai/O in world)
if (O.current == src)
O.cancel_camera()
O << "Your connection to the camera has been lost."
for(var/mob/O in world)
if (istype(O.machine, /obj/machinery/computer/security))
var/obj/machinery/computer/security/S = O.machine
if (S.current == src)
O.machine = null
S.current = null
O.reset_view(null)
O << "The screen bursts into static."
..()
if(prob(100/(hardened + severity)))
icon_state = "cameraemp"
network = null //Not the best way but it will do. I think.
spawn(900)
network = initial(network)
icon_state = initial(icon_state)
for(var/mob/living/silicon/ai/O in world)
if (O.current == src)
O.cancel_camera()
O << "Your connection to the camera has been lost."
for(var/mob/O in world)
if (istype(O.machine, /obj/machinery/computer/security))
var/obj/machinery/computer/security/S = O.machine
if (S.current == src)
O.machine = null
S.current = null
O.reset_view(null)
O << "The screen bursts into static."
..()
/obj/machinery/camera/ex_act(severity)
if(src.invuln)
@@ -25,6 +25,7 @@
list/req_components = null
powernet = null
list/records = null
frame_desc = null
/obj/item/weapon/circuitboard/security
name = "Circuit board (Security)"
+8 -4
View File
@@ -11,10 +11,6 @@
list/req_components = null
state = 1
/*
To Do: Add deconstruct code to constructable machines. A marvelous idea, I know.
*/
/obj/machinery/constructable_frame/machine_frame
attackby(obj/item/P as obj, mob/user as mob)
if(P.crit_fail)
@@ -52,6 +48,7 @@ To Do: Add deconstruct code to constructable machines. A marvelous idea, I know.
req_components = circuit.req_components.Copy()
for(var/A in circuit.req_components)
req_components[A] = circuit.req_components[A]
if(circuit.frame_desc) desc = circuit.frame_desc
else
user << "\red This frame does not accept circuit boards of this type!"
if(istype(P, /obj/item/weapon/wirecutters))
@@ -74,6 +71,7 @@ To Do: Add deconstruct code to constructable machines. A marvelous idea, I know.
user << "\blue You remove the circuit board and other components."
for(var/obj/item/weapon/W in components)
W.loc = src.loc
desc = initial(desc)
req_components = null
components = null
icon_state = "box_1"
@@ -128,6 +126,7 @@ to destroy them and players will be able to make replacements.
build_path = "/obj/machinery/r_n_d/destructive_analyzer"
board_type = "machine"
origin_tech = "magnets=2;materials=2"
frame_desc = "Requires 2 Scanning Modules, 1 Manipulator, and 1 Micro-Laser."
req_components = list(
"/obj/item/weapon/stock_parts/scanning_module" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,
@@ -138,6 +137,7 @@ to destroy them and players will be able to make replacements.
build_path = "/obj/machinery/autolathe"
board_type = "machine"
origin_tech = "materials=3"
frame_desc = "Requires 3 Matter Bins, 1 Manipulator, and 1 Console Screen."
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 3,
"/obj/item/weapon/stock_parts/manipulator" = 1,
@@ -148,6 +148,7 @@ to destroy them and players will be able to make replacements.
build_path = "/obj/machinery/r_n_d/protolathe"
board_type = "machine"
origin_tech = "materials=2"
frame_desc = "Requires 2 Matter Bins, 2 Manipulators, and 2 Beakers."
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 2,
"/obj/item/weapon/stock_parts/manipulator" = 2,
@@ -159,6 +160,7 @@ to destroy them and players will be able to make replacements.
build_path = "/obj/machinery/r_n_d/circuit_imprinter"
board_type = "machine"
origin_tech = "materials=2;programming=2"
frame_desc = "Requires 1 Matter Bin, 1 Manipulator, and 2 Beakers."
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,
@@ -169,6 +171,7 @@ to destroy them and players will be able to make replacements.
build_path = "/obj/machinery/power/port_gen/pacman"
board_type = "machine"
origin_tech = "powerstorage=3;plasmatech=3"
frame_desc = "Requires 1 Matter Bin, 1 Micro-Laser, 2 Pieces of Cable, and 1 Capacitor."
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 1,
"/obj/item/weapon/stock_parts/micro_laser" = 1,
@@ -188,6 +191,7 @@ obj/item/weapon/circuitboard/rdserver
build_path = "/obj/machinery/r_n_d/server"
board_type = "machine"
origin_tech = "programming=3"
frame_desc = "Requires 2 pieces of cable, and 1 Scanning Module."
req_components = list(
"/obj/item/weapon/cable_coil" = 2,
"/obj/item/weapon/stock_parts/scanning_module" = 1)
+9 -1
View File
@@ -775,7 +775,15 @@ datum
reliability_base = 76
build_path = "/obj/item/weapon/gun/energy/general/nuclear"
large_grenade
name = "Large Grenade"
desc = "A grenade that affects a larger area and use larger containers."
id = "large_Grenade"
req_tech = list("combat" = 3, "materials" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 3000)
reliability_base = 79
build_path = "/obj/item/weapon/chem_grenade/large"
/////////////////////////////////////////
//////////////////Test///////////////////
+1 -1
View File
@@ -189,7 +189,7 @@ When thinking about new stuff, check here to see if there are any slots unfilled
//SYNDICATE
1 | Sleepypen
2 | TYRANT Module, Emag
3 | Cloaking Device, Powre Sink
3 | Cloaking Device, Power Sink
4 |
5 |
6 |
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 476 B