Merge branch 'incremental_tg' r5514 (11/1/2013) into bs12_with_tgport

Conflicts:
	baystation12.dme
	code/ATMOSPHERICS/components/unary/vent_pump.dm
	code/ATMOSPHERICS/components/unary/vent_scrubber.dm
	code/__HELPERS/game.dm
	code/controllers/shuttle_controller.dm
	code/datums/datumvars.dm
	code/datums/supplypacks.dm
	code/defines/obj/storage.dm
	code/defines/obj/vending.dm
	code/defines/obj/weapon.dm
	code/defines/procs/command_alert.dm
	code/game/area/Space Station 13 areas.dm
	code/game/atoms.dm
	code/game/gamemodes/changeling/modularchangling.dm
	code/game/gamemodes/cult/runes.dm
	code/game/gamemodes/events.dm
	code/game/gamemodes/events/dust.dm
	code/game/gamemodes/events/miniblob.dm
	code/game/gamemodes/events/ninja_equipment.dm
	code/game/gamemodes/factions.dm
	code/game/gamemodes/game_mode.dm
	code/game/gamemodes/gameticker.dm
	code/game/jobs/access.dm
	code/game/jobs/job/assistant.dm
	code/game/jobs/job/captain.dm
	code/game/jobs/job/civilian.dm
	code/game/jobs/job/engineering.dm
	code/game/jobs/job/medical.dm
	code/game/jobs/job/science.dm
	code/game/jobs/job/security.dm
	code/game/jobs/job_controller.dm
	code/game/machinery/alarm.dm
	code/game/machinery/atmo_control.dm
	code/game/machinery/atmoalter/area_atmos_computer.dm
	code/game/machinery/bots/medbot.dm
	code/game/machinery/computer/HolodeckControl.dm
	code/game/machinery/computer/ai_core.dm
	code/game/machinery/computer/atmos_alert.dm
	code/game/machinery/computer/card.dm
	code/game/machinery/computer/cloning.dm
	code/game/machinery/computer/computer.dm
	code/game/machinery/computer/message.dm
	code/game/machinery/computer/pod.dm
	code/game/machinery/computer/prisoner.dm
	code/game/machinery/computer/syndicate_shuttle.dm
	code/game/machinery/constructable_frame.dm
	code/game/machinery/doors/door.dm
	code/game/machinery/doors/firedoor.dm
	code/game/machinery/newscaster.dm
	code/game/machinery/recharger.dm
	code/game/machinery/spaceheater.dm
	code/game/machinery/telecomms/broadcaster.dm
	code/game/machinery/telecomms/logbrowser.dm
	code/game/machinery/telecomms/machine_interactions.dm
	code/game/machinery/teleporter.dm
	code/game/machinery/wishgranter.dm
	code/game/mecha/mech_fabricator.dm
	code/game/mecha/working/ripley.dm
	code/game/objects/items.dm
	code/game/objects/items/blueprints.dm
	code/game/objects/items/devices/flashlight.dm
	code/game/objects/items/devices/radio/encryptionkey.dm
	code/game/objects/items/devices/uplinks.dm
	code/game/objects/items/stacks/medical.dm
	code/game/objects/items/weapons/cards_ids.dm
	code/game/objects/items/weapons/gift_wrappaper.dm
	code/game/objects/items/weapons/hydroponics.dm
	code/game/objects/items/weapons/manuals.dm
	code/game/objects/items/weapons/secstorage/secstorage.dm
	code/game/objects/items/weapons/storage/backpack.dm
	code/game/objects/items/weapons/storage/firstaid.dm
	code/game/objects/items/weapons/storage/kit.dm
	code/game/objects/items/weapons/storage/storage.dm
	code/game/objects/items/weapons/storage/toolbox.dm
	code/game/objects/items/weapons/storage/uplink_kits.dm
	code/game/objects/items/weapons/stunbaton.dm
	code/game/objects/items/weapons/surgery_tools.dm
	code/game/objects/items/weapons/tools.dm
	code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
	code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
	code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
	code/game/objects/structures/crates_lockers/closets/secure/security.dm
	code/game/objects/structures/electricchair.dm
	code/game/objects/structures/extinguisher.dm
	code/game/objects/structures/watercloset.dm
	code/game/objects/weapons.dm
	code/game/turfs/turf.dm
	code/game/vehicles/airtight/airtight.dm
	code/game/vehicles/vehicle.dm
	code/global.dm
	code/modules/DetectiveWork/evidence.dm
	code/modules/admin/IsBanned.dm
	code/modules/admin/player_panel.dm
	code/modules/admin/verbs/diagnostics.dm
	code/modules/admin/verbs/getlogs.dm
	code/modules/client/preferences.dm
	code/modules/clothing/masks/miscellaneous.dm
	code/modules/clothing/spacesuits/rig.dm
	code/modules/clothing/suits/miscellaneous.dm
	code/modules/critters/critter_defenses.dm
	code/modules/detectivework/scanner.dm
	code/modules/flufftext/Hallucination.dm
	code/modules/food/recipes_microwave.dm
	code/modules/mining/mine_items.dm
	code/modules/mining/mine_turfs.dm
	code/modules/mining/satchel_ore_boxdm.dm
	code/modules/mob/dead/observer/observer.dm
	code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
	code/modules/mob/living/carbon/alien/special/facehugger.dm
	code/modules/mob/living/carbon/carbon.dm
	code/modules/mob/living/carbon/carbon_defines.dm
	code/modules/mob/living/carbon/human/human.dm
	code/modules/mob/living/carbon/human/human_attackhand.dm
	code/modules/mob/living/carbon/human/life.dm
	code/modules/mob/living/carbon/human/say.dm
	code/modules/mob/living/carbon/human/update_icons.dm
	code/modules/mob/living/carbon/metroid/metroid.dm
	code/modules/mob/living/living.dm
	code/modules/mob/living/silicon/ai/life.dm
	code/modules/mob/living/silicon/robot/robot.dm
	code/modules/mob/mob_cleanup.dm
	code/modules/mob/mob_defines.dm
	code/modules/mob/mob_transformation_simple.dm
	code/modules/paperwork/clipboard.dm
	code/modules/paperwork/folders.dm
	code/modules/paperwork/paper.dm
	code/modules/paperwork/paperbin.dm
	code/modules/paperwork/pen.dm
	code/modules/power/cable.dm
	code/modules/projectiles/guns/energy/special.dm
	code/modules/projectiles/guns/projectile/revolver.dm
	code/modules/projectiles/projectile/change.dm
	code/modules/projectiles/projectile/special.dm
	code/modules/reagents/Chemistry-Reagents.dm
	code/modules/reagents/reagent_containers/glass.dm
	code/modules/reagents/reagent_containers/hypospray.dm
	code/modules/recycling/sortingmachinery.dm
	code/modules/research/designs.dm
	config/config.txt
	html/changelog.html
	icons/mob/head.dmi
	icons/mob/hud.dmi
	icons/mob/items_lefthand.dmi
	icons/mob/items_righthand.dmi
	icons/mob/mask.dmi
	icons/mob/suit.dmi
	icons/mob/ties.dmi
	icons/mob/uniform.dmi
	icons/obj/clothing/hats.dmi
	icons/obj/clothing/masks.dmi
	icons/obj/clothing/suits.dmi
	icons/obj/clothing/ties.dmi
	icons/obj/grenade.dmi
	icons/obj/projectiles.dmi

Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael_Aislinn
2013-01-11 22:12:31 +10:00
637 changed files with 28812 additions and 21593 deletions
+1 -1
View File
@@ -123,7 +123,7 @@ proc/cardinalrange(var/center)
/obj/machinery/am_shielding/update_icon()
overlays = null
overlays.Cut()
for(var/direction in alldirs)
var/machine = locate(/obj/machinery, get_step(loc, direction))
if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit)||(istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit))
+50 -33
View File
@@ -3,6 +3,8 @@
#define APC_WIRE_MAIN_POWER2 3
#define APC_WIRE_AI_CONTROL 4
#define APC_UPDATE_ICON_COOLDOWN 200 // 20 seconds
// the Area Power Controller (APC), formerly Power Distribution Unit (PDU)
// one per area, needs wire conection to power network
@@ -19,6 +21,7 @@
icon_state = "apc0"
anchored = 1
use_power = 0
req_access = list(access_engine_equip)
var/area/area
var/areastring = null
@@ -61,6 +64,7 @@
"Yellow" = 4,
)
var/longtermpower = 10
var/updating_icon = 0
//var/debug = 0
/proc/RandomAPCWires()
@@ -108,7 +112,7 @@
operating = 0
name = "[area.name] APC"
stat |= MAINT
src.updateicon()
src.update_icon()
spawn(5)
src.update()
@@ -136,7 +140,7 @@
src.area = A
else
src.area = get_area_name(areastring)
updateicon()
update_icon()
make_terminal()
@@ -172,7 +176,8 @@
// update the APC icon to show the three base states
// also add overlays for indicator lights
/obj/machinery/power/apc/proc/updateicon()
/obj/machinery/power/apc/update_icon()
overlays.Cut()
if(opened)
var/basestate = "apc[ cell ? "2" : "1" ]" // if opened, show cell if it's inserted
@@ -200,6 +205,16 @@
if(operating)
overlays.Add("apco0-[equipment]","apco1-[lighting]","apco2-[environ]") // 0=red, 1=green, 2=blue
// Used in process so it doesn't update the icon too much
/obj/machinery/power/apc/proc/queue_icon_update()
if(!updating_icon)
updating_icon = 1
// Start the update
spawn(APC_UPDATE_ICON_COOLDOWN)
update_icon()
updating_icon = 0
//attack with an item - open/close cover, insert cell, or (un)lock interface
/obj/machinery/power/apc/attackby(obj/item/W, mob/user)
@@ -212,7 +227,7 @@
user << "\red Disconnect wires first."
return
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "You trying to remove the power control board..."
user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues
if(do_after(user, 50))
has_electronics = 0
if ((stat & BROKEN) || malfhack)
@@ -228,21 +243,21 @@
new /obj/item/weapon/module/power_control(loc)
else if (opened!=2) //cover isn't removed
opened = 0
updateicon()
update_icon()
else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) )
if(coverlocked && !(stat & MAINT))
user << "\red The cover is locked and cannot be opened."
return
else
opened = 1
updateicon()
update_icon()
else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
if(cell)
user << "There is a power cell already installed."
return
else
if (stat & MAINT)
user << "\red There is no any connector for your power cell."
user << "\red There is no connector for your power cell."
return
user.drop_item()
W.loc = src
@@ -251,7 +266,7 @@
"\red [user.name] has inserted the power cell to [src.name]!",\
"You insert the power cell.")
chargecount = 0
updateicon()
update_icon()
else if (istype(W, /obj/item/weapon/screwdriver)) // haxing
if(opened)
if (cell)
@@ -271,13 +286,13 @@
else /* has_electronics==0 */
user << "\red There is nothing to secure."
return
updateicon()
update_icon()
else if(emagged)
user << "The interface is broken."
else
wiresexposed = !wiresexposed
user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
updateicon()
update_icon()
else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
if(emagged)
@@ -292,7 +307,7 @@
if(src.allowed(usr))
locked = !locked
user << "You [ locked ? "lock" : "unlock"] the APC interface."
updateicon()
update_icon()
else
user << "\red Access denied."
else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card
@@ -309,7 +324,7 @@
emagged = 1
locked = 0
user << "You emag the APC interface."
updateicon()
update_icon()
else
user << "You fail to [ locked ? "unlock" : "lock"] the APC interface."
else if (istype(W, /obj/item/weapon/cable_coil) && !terminal && opened && has_electronics!=2)
@@ -340,7 +355,7 @@
if (src.loc:intact)
user << "\red You must remove the floor plating in front of the APC first."
return
user << "You begin to cut cables..."
user << "You begin to cut the cables..."
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 50))
if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
@@ -350,8 +365,8 @@
return
new /obj/item/weapon/cable_coil(loc,10)
user.visible_message(\
"\red [user.name] cut cables and dismantled the power terminal.",\
"You cut cables and dismantle the power terminal.")
"\red [user.name] cut the cables and dismantled the power terminal.",\
"You cut the cables and dismantle the power terminal.")
del(terminal)
else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
user << "You trying to insert the power control board into the frame..."
@@ -368,7 +383,7 @@
if (WT.get_fuel() < 3)
user << "\blue You need more welding fuel to complete this task."
return
user << "You start welding APC frame..."
user << "You start welding the APC frame..."
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 50))
if(!src || !WT.remove_fuel(3, user)) return
@@ -382,7 +397,7 @@
new /obj/item/apc_frame(loc)
user.visible_message(\
"\red [src] has been cut from the wall by [user.name] with the weldingtool.",\
"You cut APC frame from the wall.",\
"You cut the APC frame from the wall.",\
"\red You hear welding.")
del(src)
return
@@ -394,7 +409,7 @@
"\red [user.name] has replaced the damaged APC frontal panel with a new one.",\
"You replace the damaged APC frontal panel with a new one.")
del(W)
updateicon()
update_icon()
else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack))
if (has_electronics)
user << "You cannot repair this APC until you remove the electronics still inside."
@@ -410,7 +425,7 @@
malfhack = 0
if (opened==2)
opened = 1
updateicon()
update_icon()
else
if ( ((stat & BROKEN) || malfhack) \
&& !opened \
@@ -421,7 +436,7 @@
user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \
"\red You knock down the APC cover with your [W.name]!", \
"You hear bang")
updateicon()
update_icon()
else
if (istype(user, /mob/living/silicon))
return src.attack_hand(user)
@@ -451,7 +466,7 @@
user.visible_message("\red [user.name] removes the power cell from [src.name]!", "You remove the power cell.")
//user << "You remove the power cell."
charging = 0
src.updateicon()
src.update_icon()
return
if(stat & (BROKEN|MAINT))
return
@@ -476,13 +491,13 @@
break
if(beenhit >= pick(3, 4) && wiresexposed != 1)
wiresexposed = 1
src.updateicon()
src.update_icon()
src.visible_message("\red The [src.name]'s cover flies open, exposing the wires!")
else if(wiresexposed == 1 && allcut == 0)
for(var/wire in apcwirelist)
cut(apcwirelist[wire])
src.updateicon()
src.update_icon()
src.visible_message("\red The [src.name]'s wires are shredded!")
else
beenhit += 1
@@ -823,20 +838,20 @@
operating ? ticker.mode:apcs++ : ticker.mode:apcs--
src.update()
updateicon()
update_icon()
else if (href_list["cmode"])
chargemode = !chargemode
if(!chargemode)
charging = 0
updateicon()
update_icon()
else if (href_list["eqp"])
var/val = text2num(href_list["eqp"])
equipment = (val==1) ? 0 : val
updateicon()
update_icon()
update()
else if (href_list["lgt"])
@@ -844,14 +859,14 @@
lighting = (val==1) ? 0 : val
updateicon()
update_icon()
update()
else if (href_list["env"])
var/val = text2num(href_list["env"])
environ = (val==1) ? 0 :val
updateicon()
update_icon()
update()
else if( href_list["close"] )
usr << browse(null, "window=apc")
@@ -888,7 +903,7 @@
else
src.malfai = usr
malfai << "Hack complete. The APC is now under your exclusive control."
updateicon()
update_icon()
else if (href_list["occupyapc"])
malfoccupy(usr)
@@ -953,7 +968,7 @@
src.cell.charge = 0
cell.corrupt()
src.malfhack = 1
updateicon()
update_icon()
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
smoke.set_up(3, 0, src.loc)
smoke.attach(src)
@@ -1139,10 +1154,10 @@
// update icon & area power if anything changed
if(last_lt != lighting || last_eq != equipment || last_en != environ)
updateicon()
queue_icon_update()
update()
else if (last_ch != charging)
updateicon()
queue_icon_update()
//src.updateDialog()
src.updateDialog()
@@ -1224,7 +1239,7 @@
operating = 0
if(occupant)
malfvacate(1)
updateicon()
update_icon()
update()
// overload all the lights in this APC area
@@ -1266,3 +1281,5 @@
return 1
else
return 0
#undef APC_UPDATE_ICON_COOLDOWN
+68 -61
View File
@@ -17,38 +17,7 @@
if(!directwired) // only for attaching to directwired machines
return
var/dirn = get_dir(user, src)
for(var/obj/structure/cable/LC in T)
if( (LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0) )
user << "There's already a cable at that position."
return
var/obj/structure/cable/NC = new(T)
NC.cableColor(coil.color)
NC.d1 = 0
NC.d2 = dirn
NC.add_fingerprint()
NC.updateicon()
NC.mergeConnectedNetworks(NC.d2)
NC.mergeConnectedNetworksOnTurf()
if(powernet == null)
if(NC.powernet == null)
NC.powernet = new()
powernets += NC.powernet
NC.powernet.cables += NC
powernet = NC.powernet
NC.powernet.nodes += src
NC.mergeConnectedNetworksOnTurf()
coil.use(1)
if (NC.shock(user, 50))
if (prob(50)) //fail
new/obj/item/weapon/cable_coil(NC.loc, 1, NC.color)
del(NC)
coil.turf_place(T, user)
return
else
..()
@@ -184,6 +153,30 @@
// the cable coil object, used for laying cable
#define MAXCOIL 30
/obj/item/weapon/cable_coil
name = "cable coil"
icon = 'icons/obj/power.dmi'
icon_state = "coil_red"
var/amount = MAXCOIL
color = "red"
desc = "A coil of power cable."
throwforce = 10
w_class = 2.0
throw_speed = 2
throw_range = 5
m_amt = 50
g_amt = 20
flags = TABLEPASS | USEDELAY | FPRINT | CONDUCT
slot_flags = SLOT_BELT
item_state = "coil_red"
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
suicide_act(mob/user)
viewers(user) << "\red <b>[user] is strangling \himself with the [src]! It looks like \he's trying to commit suicide.</b>"
return(OXYLOSS)
/obj/item/weapon/cable_coil/New(loc, length = MAXCOIL, var/param_color = null)
..()
src.amount = length
@@ -193,14 +186,6 @@
pixel_y = rand(-2,2)
updateicon()
/obj/item/weapon/cable_coil/cut/New(loc)
..()
src.amount = rand(1,2)
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
updateicon()
/obj/item/weapon/cable_coil/proc/updateicon()
if (!color)
color = pick("red", "yellow", "blue", "green")
@@ -489,7 +474,7 @@
merge_powernets(powernet, N.terminal.powernet)
else
N.terminal.powernet = powernet
powernet.nodes += N.terminal
powernet.nodes[N.terminal] = N.terminal
else if(istype(AM,/obj/machinery/power))
var/obj/machinery/power/M = AM
@@ -498,7 +483,7 @@
merge_powernets(powernet, M.powernet)
else
M.powernet = powernet
powernet.nodes += M
powernet.nodes[M] = M
obj/structure/cable/proc/cableColor(var/colorC)
@@ -524,23 +509,45 @@ obj/structure/cable/proc/cableColor(var/colorC)
if("white")
icon = 'icons/obj/power_cond_white.dmi'
/obj/item/weapon/cable_coil/cut
item_state = "coil_red2"
/obj/item/weapon/cable_coil/attack(mob/M as mob, mob/user as mob)
if(hasorgans(M))
var/datum/organ/external/S = M:get_organ(user.zone_sel.selecting)
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
if(S.burn_dam > 0)
S.heal_damage(0,15,0,1)
if(user != M)
user.visible_message("\red \The [user] repairs some burn damage on their [S.display_name] with \the [src]",\
"\red You repair some burn damage on your [S.display_name]",\
"You hear wires being cut.")
else
user.visible_message("\red \The [user] repairs some burn damage on their [S.display_name] with \the [src]",\
"\red You repair some burn damage on your [S.display_name]",\
"You hear wires being cut.")
else
user << "Nothing to fix!"
else
return ..()
/obj/item/weapon/cable_coil/cut/New(loc)
..()
src.amount = rand(1,2)
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
updateicon()
/obj/item/weapon/cable_coil/yellow
color = "yellow"
icon_state = "coil_yellow"
/obj/item/weapon/cable_coil/blue
color = "blue"
icon_state = "coil_blue"
/obj/item/weapon/cable_coil/green
color = "green"
icon_state = "coil_green"
/obj/item/weapon/cable_coil/pink
color = "pink"
icon_state = "coil_pink"
/obj/item/weapon/cable_coil/orange
color = "orange"
icon_state = "coil_orange"
/obj/item/weapon/cable_coil/cyan
color = "cyan"
icon_state = "coil_cyan"
/obj/item/weapon/cable_coil/white
color = "white"
icon_state = "coil_white"
/obj/item/weapon/cable_coil/random/New()
color = pick("red","yellow","green","blue","pink")
icon_state = "coil_[color]"
..()
+1 -1
View File
@@ -10,7 +10,7 @@
updateicon()
/obj/item/weapon/cell/proc/updateicon()
overlays = null
overlays.Cut()
if(charge < 0.01)
return
+3 -2
View File
@@ -12,6 +12,7 @@
icon_state = "teg"
anchored = 1
density = 1
use_power = 0
var/obj/machinery/atmospherics/binary/circulator/circ1
var/obj/machinery/atmospherics/binary/circulator/circ2
@@ -42,9 +43,9 @@
/obj/machinery/power/generator/proc/updateicon()
if(stat & (NOPOWER|BROKEN))
overlays = null
overlays.Cut()
else
overlays = null
overlays.Cut()
if(lastgenlev != 0)
overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
+3 -2
View File
@@ -4,6 +4,7 @@
icon_state = "teg"
anchored = 1
density = 1
use_power = 0
var/obj/machinery/atmospherics/unary/generator_input/input1
var/obj/machinery/atmospherics/unary/generator_input/input2
@@ -25,9 +26,9 @@
/obj/machinery/power/generator_type2/proc/updateicon()
if(stat & (NOPOWER|BROKEN))
overlays = null
overlays.Cut()
else
overlays = null
overlays.Cut()
if(lastgenlev != 0)
overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
-40
View File
@@ -727,43 +727,3 @@
force = 5
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
update()
// a box of replacement light items
/obj/item/weapon/storage/lightbox
name = "replacement bulbs"
icon = 'icons/obj/storage.dmi'
icon_state = "light"
desc = "This box is shaped on the inside so that only light tubes and bulbs fit."
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots=21
can_hold = list("/obj/item/weapon/light/tube", "/obj/item/weapon/light/bulb")
max_combined_w_class = 21
/obj/item/weapon/storage/lightbox/bulbs/New()
..()
for(var/i = 0; i < 21; i++)
new /obj/item/weapon/light/bulb(src)
/obj/item/weapon/storage/lightbox/tubes
name = "replacement tubes"
icon_state = "lighttube"
/obj/item/weapon/storage/lightbox/tubes/New()
..()
for(var/i = 0; i < 21; i++)
new /obj/item/weapon/light/tube(src)
/obj/item/weapon/storage/lightbox/mixed
name = "replacement lights"
icon_state = "lightmixed"
/obj/item/weapon/storage/lightbox/mixed/New()
..()
for(var/i = 0; i < 14; i++)
new /obj/item/weapon/light/tube(src)
for(var/i = 0; i < 7; i++)
new /obj/item/weapon/light/bulb(src)
+81 -53
View File
@@ -48,7 +48,7 @@ display round(lastgen) and plasmatank amount
icon_state = "portgen0"
density = 1
anchored = 0
directwired = 1
directwired = 0
use_power = 0
var/active = 0
@@ -57,55 +57,58 @@ display round(lastgen) and plasmatank amount
var/recent_fault = 0
var/power_output = 1
proc/HasFuel() //Placeholder for fuel check.
return 1
/obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check.
return 1
proc/UseFuel() //Placeholder for fuel use.
/obj/machinery/power/port_gen/proc/UseFuel() //Placeholder for fuel use.
return
/obj/machinery/power/port_gen/proc/DropFuel()
return
/obj/machinery/power/port_gen/proc/handleInactive()
return
/obj/machinery/power/port_gen/process()
if(active && HasFuel() && !crit_fail && anchored && powernet)
add_avail(power_gen * power_output)
UseFuel()
src.updateDialog()
else
active = 0
icon_state = initial(icon_state)
handleInactive()
/obj/machinery/power/port_gen/attack_hand(mob/user as mob)
if(..())
return
if(!anchored)
return
proc/handleInactive()
return
process()
if(active && HasFuel() && !crit_fail && anchored)
if(prob(reliability))
add_avail(power_gen * power_output)
else if(!recent_fault)
recent_fault = 1
else crit_fail = 1
UseFuel()
for(var/mob/M in viewers(1, src))
if (M.client && M.machine == src)
src.updateUsrDialog()
else
active = 0
icon_state = initial(icon_state)
handleInactive()
attack_hand(mob/user as mob)
if(..())
return
if(!anchored)
return
examine()
set src in oview(1)
if(active)
usr << "\blue The generator is on."
else
usr << "\blue The generator is off."
/obj/machinery/power/port_gen/examine()
set src in oview(1)
if(active)
usr << "\blue The generator is on."
else
usr << "\blue The generator is off."
/obj/machinery/power/port_gen/pacman
name = "P.A.C.M.A.N.-type Portable Generator"
var/sheets = 0
var/max_sheets = 100
var/sheet_name = ""
var/sheet_path = /obj/item/stack/sheet/mineral/plasma
var/board_path = "/obj/item/weapon/circuitboard/pacman"
var/sheet_left = 0 // How much is left of the sheet
var/time_per_sheet = 10
var/time_per_sheet = 40
var/heat = 0
/obj/machinery/power/port_gen/pacman/initialize()
..()
if(anchored)
connect_to_network()
/obj/machinery/power/port_gen/pacman/New()
..()
component_parts = list()
@@ -115,8 +118,14 @@ display round(lastgen) and plasmatank amount
component_parts += new /obj/item/weapon/cable_coil(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new board_path(src)
var/obj/sheet = new sheet_path(null)
sheet_name = sheet.name
RefreshParts()
/obj/machinery/power/port_gen/pacman/Del()
DropFuel()
..()
/obj/machinery/power/port_gen/pacman/RefreshParts()
var/temp_rating = 0
var/temp_reliability = 0
@@ -132,7 +141,7 @@ display round(lastgen) and plasmatank amount
/obj/machinery/power/port_gen/pacman/examine()
..()
usr << "\blue The generator has [sheets] units of fuel left, producing [power_gen] per cycle."
usr << "\blue The generator has [sheets] units of [sheet_name] fuel left, producing [power_gen] per cycle."
if(crit_fail) usr << "\red The generator seems to have broken down."
/obj/machinery/power/port_gen/pacman/HasFuel()
@@ -140,6 +149,16 @@ display round(lastgen) and plasmatank amount
return 1
return 0
/obj/machinery/power/port_gen/pacman/DropFuel()
if(sheets)
var/fail_safe = 0
while(sheets > 0 && fail_safe < 100)
fail_safe += 1
var/obj/item/stack/sheet/S = new sheet_path(loc)
var/amount = min(sheets, S.max_amount)
S.amount = amount
sheets -= amount
/obj/machinery/power/port_gen/pacman/UseFuel()
var/needed_sheets = 1 / (time_per_sheet / power_output)
var/temp = min(needed_sheets, sheet_left)
@@ -172,13 +191,10 @@ display round(lastgen) and plasmatank amount
return
/obj/machinery/power/port_gen/pacman/handleInactive()
heat -= 2
if (heat < 0)
heat = 0
else
for(var/mob/M in viewers(1, src))
if (M.client && M.machine == src)
src.updateUsrDialog()
if (heat > 0)
heat = max(heat - 2, 0)
src.updateDialog()
/obj/machinery/power/port_gen/pacman/proc/overheat()
explosion(src.loc, 2, 5, 2, -1)
@@ -193,19 +209,25 @@ display round(lastgen) and plasmatank amount
user << "\blue You add [amount] sheets to the [src.name]."
sheets += amount
addstack.use(amount)
updateUsrDialog()
return
else if (istype(O, /obj/item/weapon/card/emag))
emagged = 1
emp_act(1)
else if(!active)
if(istype(O, /obj/item/weapon/wrench))
anchored = !anchored
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(anchored)
if(!anchored)
connect_to_network()
user << "\blue You secure the generator to the floor."
else
disconnect_from_network()
user << "\blue You unsecure the generator from the floor."
makepowernets()
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
anchored = !anchored
else if(istype(O, /obj/item/weapon/screwdriver))
open = !open
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -260,13 +282,15 @@ display round(lastgen) and plasmatank amount
dat += text("Generator: <A href='?src=\ref[src];action=disable'>On</A><br>")
else
dat += text("Generator: <A href='?src=\ref[src];action=enable'>Off</A><br>")
dat += text("sheets: [sheets]<br>")
dat += text("[capitalize(sheet_name)]: [sheets] - <A href='?src=\ref[src];action=eject'>Eject</A><br>")
var/stack_percent = round(sheet_left * 100, 1)
dat += text("Current stack: [stack_percent]%<br>")
dat += text("Current stack: [stack_percent]% <br>")
dat += text("Power output: <A href='?src=\ref[src];action=lower_power'>-</A> [power_gen * power_output] <A href='?src=\ref[src];action=higher_power'>+</A><br>")
dat += text("Power current: [(powernet == null ? "Unconnected" : "[avail()]")]<br>")
dat += text("Heat: [heat]<br>")
dat += "<br><A href='?src=\ref[src];action=close'>Close</A>"
user << browse("[dat]", "window=port_gen")
onclose(user, "port_gen")
/obj/machinery/power/port_gen/pacman/Topic(href, href_list)
if(..())
@@ -284,6 +308,10 @@ display round(lastgen) and plasmatank amount
active = 0
icon_state = "portgen0"
src.updateUsrDialog()
if(href_list["action"] == "eject")
if(!active)
DropFuel()
src.updateUsrDialog()
if(href_list["action"] == "lower_power")
if (power_output > 1)
power_output--
@@ -301,7 +329,7 @@ display round(lastgen) and plasmatank amount
icon_state = "portgen1"
sheet_path = /obj/item/stack/sheet/mineral/uranium
power_gen = 15000
time_per_sheet = 25
time_per_sheet = 65
board_path = "/obj/item/weapon/circuitboard/pacman/super"
overheat()
explosion(src.loc, 3, 3, 3, -1)
@@ -311,7 +339,7 @@ display round(lastgen) and plasmatank amount
icon_state = "portgen2"
sheet_path = /obj/item/stack/sheet/mineral/diamond
power_gen = 40000
time_per_sheet = 30
time_per_sheet = 80
board_path = "/obj/item/weapon/circuitboard/pacman/mrs"
overheat()
explosion(src.loc, 4, 4, 4, -1)
+38 -11
View File
@@ -9,6 +9,10 @@
idle_power_usage = 0
active_power_usage = 0
/obj/machinery/power/Del()
disconnect_from_network()
..()
// common helper procs for all power machines
/obj/machinery/power/proc/add_avail(var/amount)
if(powernet)
@@ -38,6 +42,9 @@
if(!src.loc)
return 0
if(!use_power)
return 1
var/area/A = src.loc.loc // make sure it's in an area
if(!A || !isarea(A) || !A.master)
return 0 // if not, then not powered
@@ -92,7 +99,7 @@
for(var/obj/machinery/power/M in machines)
if(!M.powernet) continue // APCs have powernet=0 so they don't count as network nodes directly
M.powernet.nodes += M
M.powernet.nodes[M] = M
// returns a list of all power-related objects (nodes, cable, junctions) in turf,
@@ -171,7 +178,7 @@
C.powernet = PN
P = C.get_connections()
else if( istype(O,/obj/machinery/power) )
else if(O.anchored && istype(O,/obj/machinery/power))
var/obj/machinery/power/M = O
M.powernet = PN
P = M.get_connections()
@@ -188,6 +195,9 @@
/datum/powernet/proc/cut_cable(var/obj/structure/cable/C)
var/turf/T1 = C.loc
if(!T1) return
var/node = 0
if(C.d1 == 0)
node = 1
var/turf/T2
if(C.d2) T2 = get_step(T1, C.d2)
@@ -222,11 +232,13 @@
i=1
while(i<=nodes.len)
var/obj/machinery/power/Node = nodes[i]
if(Node) Node.powernet = null
if(Node)
Node.powernet = null
i++
// remove the cut cable from the network
// C.netnum = -1
C.loc = null
powernet_nextlink(P1[1], src) // propagate network from 1st side of cable, using current netnum //TODO?
@@ -269,10 +281,15 @@
if(Node && !Node.powernet)
Node.powernet = PN
nodes.Cut(i,i+1)
PN.nodes += Node
PN.nodes[Node] = Node
continue
i++
// Disconnect machines connected to nodes
if(node)
for(var/obj/machinery/power/P in T1)
if(P.powernet && !P.powernet.nodes[src])
P.disconnect_from_network()
// if(Debug)
// world.log << "Old PN#[number] : ([cables.len];[nodes.len])"
// world.log << "New PN#[PN.number] : ([PN.cables.len];[PN.nodes.len])"
@@ -298,7 +315,7 @@
var/numapc = 0
if(nodes) // Added to fix a bad list bug -- TLE
if(nodes && nodes.len) // Added to fix a bad list bug -- TLE
for(var/obj/machinery/power/terminal/term in nodes)
if( istype( term.master, /obj/machinery/power/apc ) )
numapc++
@@ -309,8 +326,13 @@
netexcess = avail - load
if( netexcess > 100) // if there was excess power last cycle
for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network
S.restore() // and restore some of the power that was used
if(nodes && nodes.len)
for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network
if(S.powernet == src)
S.restore() // and restore some of the power that was used
else
error("[S.name] (\ref[S]) had a [S.powernet ? "different (\ref[S.powernet])" : "null"] powernet to our powernet (\ref[src]).")
nodes.Remove(S)
/datum/powernet/proc/get_electrocute_damage()
switch(avail)/*
@@ -359,7 +381,7 @@
var/obj/machinery/power/Node = net2.nodes[i]
if(Node)
Node.powernet = net1
net1.nodes += Node
net1.nodes[Node] = Node
for(var/i=1,i<=net2.cables.len,i++)
var/obj/structure/cable/Cable = net2.cables[i]
@@ -374,15 +396,20 @@
/obj/machinery/power/proc/connect_to_network()
var/turf/T = src.loc
var/obj/structure/cable/C = T.get_cable_node()
if(!C || !C.powernet) return
if(!C || !C.powernet) return 0
// makepowernets() //TODO: find fast way //EWWWW what are you doing!?
powernet = C.powernet
powernet.nodes += src
powernet.nodes[src] = src
return 1
/obj/machinery/power/proc/disconnect_from_network()
if(!powernet) return
if(!powernet)
//world << " no powernet"
return 0
powernet.nodes -= src
powernet = null
//world << "powernet null"
return 1
/turf/proc/get_cable_node()
if(!istype(src, /turf/simulated/floor))
+2 -2
View File
@@ -9,7 +9,7 @@ var/global/list/rad_collectors = list()
anchored = 0
density = 1
directwired = 1
req_access = list(access_engine)
req_access = list(access_engine_equip)
// use_power = 0
var/obj/item/weapon/tank/plasma/P = null
var/last_power = 0
@@ -129,7 +129,7 @@ var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector/proc/update_icons()
overlays = null
overlays.Cut()
if(P)
overlays += image('icons/obj/singularity.dmi', "ptank")
if(stat & (NOPOWER|BROKEN))
+44 -29
View File
@@ -1,19 +1,20 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
/obj/machinery/emitter
/obj/machinery/power/emitter
name = "Emitter"
desc = "A heavy duty industrial laser"
icon = 'icons/obj/singularity.dmi'
icon_state = "emitter"
anchored = 0
density = 1
req_access = list(access_engine)
req_access = list(access_engine_equip)
use_power = 1
use_power = 0
idle_power_usage = 10
active_power_usage = 300
var/active = 0
var/powered = 0
var/fire_delay = 100
var/last_shot = 0
var/shot_number = 0
@@ -21,7 +22,7 @@
var/locked = 0
/obj/machinery/emitter/verb/rotate()
/obj/machinery/power/emitter/verb/rotate()
set name = "Rotate"
set category = "Object"
set src in oview(1)
@@ -32,33 +33,36 @@
src.dir = turn(src.dir, 90)
return 1
/obj/machinery/emitter/New()
/obj/machinery/power/emitter/initialize()
..()
return
if(state == 2 && anchored)
connect_to_network()
src.directwired = 1
/obj/machinery/emitter/Del()
message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
/obj/machinery/power/emitter/Del()
message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Emitter deleted at ([x],[y],[z])")
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z])","singulo")
..()
/obj/machinery/emitter/update_icon()
if (active && !(stat & (NOPOWER|BROKEN)))
/obj/machinery/power/emitter/update_icon()
if (active && powernet && avail(active_power_usage))
icon_state = "emitter_+a"
else
icon_state = "emitter"
/obj/machinery/emitter/attack_hand(mob/user as mob)
/obj/machinery/power/emitter/attack_hand(mob/user as mob)
src.add_fingerprint(user)
if(state == 2)
if(!powernet)
user << "The emitter isn't connected to a wire."
return 1
if(!src.locked)
if(src.active==1)
src.active = 0
user << "You turn off the [src]."
src.use_power = 1
message_admins("Emitter turned off by [key_name(user, user.client)](<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
message_admins("Emitter turned off by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])")
investigate_log("turned <font color='red'>off</font> by [user.key]","singulo")
else
@@ -66,7 +70,6 @@
user << "You turn on the [src]."
src.shot_number = 0
src.fire_delay = 100
src.use_power = 2
investigate_log("turned <font color='green'>on</font> by [user.key]","singulo")
update_icon()
else
@@ -76,8 +79,8 @@
return 1
/obj/machinery/emitter/emp_act(var/severity)//Emitters are hardened but still might have issues
use_power(1000)
/obj/machinery/power/emitter/emp_act(var/severity)//Emitters are hardened but still might have issues
// add_load(1000)
/* if((severity == 1)&&prob(1)&&prob(1))
if(src.active)
src.active = 0
@@ -87,13 +90,28 @@
/obj/machinery/containment_field/meteorhit()
return 0
/obj/machinery/emitter/process()
if(stat & (NOPOWER|BROKEN))
/obj/machinery/power/emitter/process()
if(stat & (BROKEN))
return
if(src.state != 2)
if(src.state != 2 || (!powernet && active_power_usage))
src.active = 0
update_icon()
return
if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1))
if(!active_power_usage || avail(active_power_usage))
add_load(active_power_usage)
if(!powered)
powered = 1
update_icon()
investigate_log("regained power and turned <font color='green'>on</font>","singulo")
else
if(powered)
powered = 0
update_icon()
investigate_log("lost power and turned <font color='red'>off</font>","singulo")
return
src.last_shot = world.time
if(src.shot_number < 3)
src.fire_delay = 2
@@ -101,7 +119,6 @@
else
src.fire_delay = rand(20,100)
src.shot_number = 0
use_power(1000)
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1)
if(prob(35))
@@ -125,7 +142,7 @@
A.process() //TODO: Carn: check this out
/obj/machinery/emitter/attackby(obj/item/W, mob/user)
/obj/machinery/power/emitter/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/wrench))
if(active)
@@ -168,6 +185,8 @@
if(!src || !WT.isOn()) return
state = 2
user << "You weld the [src] to the floor."
connect_to_network()
src.directwired = 1
else
user << "\red You need more welding fuel to complete this task."
if(2)
@@ -180,6 +199,8 @@
if(!src || !WT.isOn()) return
state = 1
user << "You cut the [src] free from the floor."
disconnect_from_network()
src.directwired = 0
else
user << "\red You need more welding fuel to complete this task."
return
@@ -207,10 +228,4 @@
return
..()
return
/obj/machinery/emitter/power_change()
..()
update_icon()
return
return
@@ -34,7 +34,7 @@ field_generator power level display
/obj/machinery/field_generator/update_icon()
overlays = null
overlays.Cut()
if(!active)
if(warming_up)
overlays += "+a[warming_up]"
@@ -82,7 +82,7 @@
src.toggle_power()
investigate_log("turned [active?"<font color='red'>ON</font>":"<font color='green'>OFF</font>"] by [usr.key]","singulo")
if (active)
message_admins("PA Control Computer turned ON by [key_name(usr, usr.client)](<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
message_admins("PA Control Computer turned ON by [key_name(usr, usr.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])")
else if(href_list["scan"])
src.part_scan()
@@ -91,7 +91,7 @@
if(strength > 2)
strength = 2
else
message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])")
investigate_log("increased to <font color='red'>[strength]</font> by [usr.key]","singulo")
for(var/obj/structure/particle_accelerator/part in connected_parts)
+22 -26
View File
@@ -49,11 +49,6 @@ var/global/list/uneatable = list(
return
/obj/machinery/singularity/Del()
//Could have it do something bad when this happens, explode/implode or something
..()
/obj/machinery/singularity/attack_hand(mob/user as mob)
consume(user)
return 1
@@ -91,13 +86,12 @@ var/global/list/uneatable = list(
eat()
dissipate()
check_energy()
if(current_size >= 3)
move()
if(current_size <= 7)
pulse()
if(current_size >= 5)
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
pulse()
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
return
@@ -295,19 +289,17 @@ var/global/list/uneatable = list(
return
/obj/machinery/singularity/proc/move(var/movement_dir = 0)
/obj/machinery/singularity/proc/move(var/force_move = 0)
if(!move_self)
return 0
var/movement_dir = pick(alldirs - last_failed_movement)
if(force_move)
movement_dir = force_move
if(target && prob(60))
movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
else if(!(movement_dir in cardinal))
movement_dir = pick(NORTH, EAST, WEST, SOUTH)
if(movement_dir == last_failed_movement)
var/list/L = new/list(NORTH, EAST, WEST, SOUTH)
L.Remove(last_failed_movement)
movement_dir = pick(L)
if(current_size >= 9)//The superlarge one does not care about things in its way
spawn(0)
@@ -418,19 +410,23 @@ var/global/list/uneatable = list(
radiation = round(((src.energy-150)/50)*5,1)
radiationmin = round((radiation/5),1)//
for(var/mob/living/M in view(toxrange, src.loc))
if(istype(M,/mob/living/))
M.apply_effect(rand(radiationmin,radiation), IRRADIATE)
toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad")))
M.apply_effect(toxdamage, TOX)
M.apply_effect(rand(radiationmin,radiation), IRRADIATE)
toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad")))
M.apply_effect(toxdamage, TOX)
return
/obj/machinery/singularity/proc/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(istype(M,/mob/living/carbon/human) && M.stat == CONSCIOUS)
if(istype(M:glasses,/obj/item/clothing/glasses/meson))
M << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!"
return
if(istype(M, /mob/living/carbon/brain)) //Ignore brains
continue
if(M.stat == CONSCIOUS)
if (istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(istype(H.glasses,/obj/item/clothing/glasses/meson))
H << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!"
return
M << "\red You look directly into The [src.name] and feel weak."
M.apply_effect(3, STUN)
for(var/mob/O in viewers(M, null))
+4 -5
View File
@@ -10,6 +10,7 @@
icon_state = "smes"
density = 1
anchored = 1
use_power = 0
var/output = 50000
var/lastout = 0
var/loaddemand = 0
@@ -43,7 +44,7 @@
/obj/machinery/power/smes/proc/updateicon()
overlays = null
overlays.Cut()
if(stat & BROKEN) return
overlays += image('icons/obj/power.dmi', "smes-op[online]")
@@ -118,10 +119,7 @@
if(last_disp != chargedisplay() || last_chrg != charging || last_onln != online)
updateicon()
for(var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))
src.interact(M)
AutoUpdateAI(src)
updateDialog()
return
// called after all power processes are finished
@@ -366,3 +364,4 @@
return rate
#undef SMESRATE
+342 -213
View File
@@ -1,6 +1,20 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
#define SOLAR_MAX_DIST 40
#define SOLARGENRATE 1500
var/list/solars_list = list()
// This will choose whether to get the solar list from the powernet or the powernet nodes,
// depending on the size of the nodes.
/obj/machinery/power/proc/get_solars_powernet()
if(!powernet)
return list()
if(solars_list.len < powernet.nodes)
return solars_list
else
return powernet.nodes
/obj/machinery/power/solar
name = "solar panel"
desc = "A solar electrical generator."
@@ -12,8 +26,8 @@
use_power = 0
idle_power_usage = 0
active_power_usage = 0
var/id = 0
var/health = 10
var/id = 1
var/obscured = 0
var/sunfrac = 0
var/adir = SOUTH
@@ -21,25 +35,50 @@
var/turn_angle = 0
var/obj/machinery/power/solar_control/control = null
/obj/machinery/power/solar/New(var/turf/loc, var/obj/item/solar_assembly/S, var/process = 1)
..(loc)
Make(S)
connect_to_network(process)
/obj/machinery/power/solar/New()
/obj/machinery/power/solar/disconnect_from_network()
..()
spawn(10)
updateicon()
update_solar_exposure()
if(powernet)
for(var/obj/machinery/power/solar_control/SC in powernet.nodes)
if(SC.id == id)
control = SC
solars_list.Remove(src)
/obj/machinery/power/solar/connect_to_network(var/process)
..()
if(process)
solars_list.Add(src)
/obj/machinery/power/solar/proc/Make(var/obj/item/solar_assembly/S)
if(!S)
S = new /obj/item/solar_assembly(src)
S.glass_type = /obj/item/stack/sheet/glass
S.anchored = 1
S.loc = src
update_icon()
/obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user)
..()
if (W)
if(iscrowbar(W))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 50))
var/obj/item/solar_assembly/S = locate() in src
if(S)
S.loc = src.loc
S.give_glass()
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("<span class='notice'>[user] takes the glass off the solar panel.</span>")
del(src)
return
else if (W)
src.add_fingerprint(user)
src.health -= W.force
src.healthcheck()
return
..()
/obj/machinery/power/solar/blob_act()
@@ -60,8 +99,9 @@
return
/obj/machinery/power/solar/proc/updateicon()
overlays = null
/obj/machinery/power/solar/update_icon()
..()
overlays.Cut()
if(stat & BROKEN)
overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)
else
@@ -86,24 +126,24 @@
/obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY
if(stat & BROKEN) return
if(!control) return
if(adir != ndir)
adir = (360+adir+dd_range(-10,10,ndir-adir))%360
update_icon()
update_solar_exposure()
if(obscured) return
var/sgen = SOLARGENRATE * sunfrac
add_avail(sgen)
if(powernet && control)
if(control in powernet.nodes) //this line right here...
if(powernet.nodes[control])
control.gen += sgen
if(adir != ndir)
spawn(10+rand(0,15))
adir = (360+adir+dd_range(-10,10,ndir-adir))%360
updateicon()
update_solar_exposure()
/obj/machinery/power/solar/proc/broken()
stat |= BROKEN
updateicon()
update_icon()
return
@@ -140,12 +180,87 @@
src.density = 0
/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S)
..(loc, S, 0)
/obj/machinery/power/solar/fake/process()
. = PROCESS_KILL
return
//
// Solar Assembly - For construction of solar arrays.
//
/obj/item/solar_assembly
name = "solar panel assembly"
desc = "A solar panel assembly kit, allows constructions of a solar panel, or with a tracking circuit board, a solar tracker"
icon = 'icons/obj/power.dmi'
icon_state = "sp_base"
item_state = "electropack"
w_class = 4 // Pretty big!
anchored = 0
var/tracker = 0
var/glass_type = null
/obj/item/solar_assembly/attack_hand(var/mob/user)
if(!anchored && isturf(loc)) // You can't pick it up
..()
// Give back the glass type we were supplied with
/obj/item/solar_assembly/proc/give_glass()
if(glass_type)
var/obj/item/stack/sheet/S = new glass_type(src.loc)
S.amount = 2
glass_type = null
/obj/item/solar_assembly/attackby(var/obj/item/weapon/W, var/mob/user)
if(!anchored && isturf(loc))
if(iswrench(W))
anchored = 1
user.visible_message("<span class='notice'>[user] wrenches the solar assembly into place.</span>")
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
return 1
else
if(iswrench(W))
anchored = 0
user.visible_message("<span class='notice'>[user] unwrenches the solar assembly from it's place.</span>")
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
return 1
if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass))
var/obj/item/stack/sheet/S = W
if(S.amount >= 2)
glass_type = W.type
S.use(2)
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("<span class='notice'>[user] places the glass on the solar assembly.</span>")
if(tracker)
new /obj/machinery/power/tracker(get_turf(src), src)
else
new /obj/machinery/power/solar(get_turf(src), src)
return 1
if(!tracker)
if(istype(W, /obj/item/weapon/tracker_electronics))
tracker = 1
user.drop_item()
del(W)
user.visible_message("<span class='notice'>[user] inserts the electronics into the solar assembly.</span>")
return 1
else
if(iscrowbar(W))
new /obj/item/weapon/tracker_electronics(src.loc)
tracker = 0
user.visible_message("<span class='notice'>[user] takes out the electronics from the solar assembly.</span>")
return 1
..()
//
// Solar Control Computer
//
/obj/machinery/power/solar_control
name = "solar panel control"
@@ -158,7 +273,7 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 20
var/id = 1
var/id = 0
var/cdir = 0
var/gen = 0
var/lastgen = 0
@@ -166,227 +281,241 @@
var/trackrate = 600 // 300-900 seconds
var/trackdir = 1 // 0 =CCW, 1=CW
var/nexttime = 0
proc
updateicon()
tracker_update(var/angle)
set_panels(var/cdir)
broken()
New()
..()
spawn(15)
if(!powernet) return
for(var/obj/machinery/power/solar/S in powernet.nodes)
if(S.id != id) continue
cdir = S.adir//The hell is this even doing?
S.control = src
updateicon()
/obj/machinery/power/solar_control/New()
..()
if(ticker)
initialize()
connect_to_network()
/obj/machinery/power/solar_control/disconnect_from_network()
..()
solars_list.Remove(src)
/obj/machinery/power/solar_control/connect_to_network()
..()
if(powernet)
solars_list.Add(src)
/obj/machinery/power/solar_control/initialize()
..()
if(!powernet) return
set_panels(cdir)
/obj/machinery/power/solar_control/update_icon()
if(stat & BROKEN)
icon_state = "broken"
overlays.Cut()
return
if(stat & NOPOWER)
icon_state = "c_unpowered"
overlays.Cut()
return
icon_state = "solar"
overlays.Cut()
if(cdir > 0)
overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))
return
updateicon()
if(stat & BROKEN)
icon_state = "broken"
overlays = null
return
if(stat & NOPOWER)
icon_state = "c_unpowered"
overlays = null
return
icon_state = "solar"
overlays = null
if(cdir > 0)
overlays += image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))
/obj/machinery/power/solar_control/attack_ai(mob/user)
add_fingerprint(user)
if(stat & (BROKEN | NOPOWER)) return
interact(user)
/obj/machinery/power/solar_control/attack_hand(mob/user)
add_fingerprint(user)
if(stat & (BROKEN | NOPOWER)) return
interact(user)
/obj/machinery/power/solar_control/attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
A.icon_state = "3"
A.anchored = 1
del(src)
else
user << "\blue You disconnect the monitor."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
A.icon_state = "4"
A.anchored = 1
del(src)
else
src.attack_hand(user)
return
/obj/machinery/power/solar_control/process()
lastgen = gen
gen = 0
if(stat & (NOPOWER | BROKEN))
return
use_power(250)
if(track==1 && nexttime < world.timeofday && trackrate)
nexttime = world.timeofday + 3600/abs(trackrate)
cdir = (cdir+trackrate/abs(trackrate)+360)%360
set_panels(cdir)
update_icon()
attack_ai(mob/user)
add_fingerprint(user)
if(stat & (BROKEN | NOPOWER)) return
interact(user)
attack_hand(mob/user)
add_fingerprint(user)
if(stat & (BROKEN | NOPOWER)) return
interact(user)
attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
A.icon_state = "3"
A.anchored = 1
del(src)
else
user << "\blue You disconnect the monitor."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
A.icon_state = "4"
A.anchored = 1
del(src)
else
src.attack_hand(user)
return
process()
lastgen = gen
gen = 0
if(stat & (NOPOWER | BROKEN))
return
use_power(250)
if(track==1 && nexttime < world.timeofday && trackrate)
nexttime = world.timeofday + 3600/abs(trackrate)
cdir = (cdir+trackrate/abs(trackrate)+360)%360
set_panels(cdir)
updateicon()
src.updateDialog()
src.updateDialog()
// called by solar tracker when sun position changes
tracker_update(var/angle)
if(track != 2 || stat & (NOPOWER | BROKEN))
/obj/machinery/power/solar_control/proc/tracker_update(var/angle)
if(track != 2 || stat & (NOPOWER | BROKEN))
return
cdir = angle
set_panels(cdir)
update_icon()
src.updateDialog()
/obj/machinery/power/solar_control/interact(mob/user)
if(stat & (BROKEN | NOPOWER)) return
if ( (get_dist(src, user) > 1 ))
if (!istype(user, /mob/living/silicon/ai))
user.unset_machine()
user << browse(null, "window=solcon")
return
cdir = angle
set_panels(cdir)
updateicon()
src.updateDialog()
add_fingerprint(user)
user.set_machine(src)
var/t = "<TT><B>Solar Generator Control</B><HR><PRE>"
t += "Generated power : [round(lastgen)] W<BR><BR>"
t += "<B>Orientation</B>: [rate_control(src,"cdir","[cdir]&deg",1,15)] ([angle2text(cdir)])<BR><BR><BR>"
t += "<BR><HR><BR><BR>"
t += "Tracking: "
switch(track)
if(0)
t += "<B>Off</B> <A href='?src=\ref[src];track=1'>Timed</A> <A href='?src=\ref[src];track=2'>Auto</A><BR>"
if(1)
t += "<A href='?src=\ref[src];track=0'>Off</A> <B>Timed</B> <A href='?src=\ref[src];track=2'>Auto</A><BR>"
if(2)
t += "<A href='?src=\ref[src];track=0'>Off</A> <A href='?src=\ref[src];track=1'>Timed</A> <B>Auto</B><BR>"
t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",5,30,180)]<BR><BR>"
t += "<A href='?src=\ref[src];close=1'>Close</A></TT>"
user << browse(t, "window=solcon")
onclose(user, "solcon")
return
interact(mob/user)
if(stat & (BROKEN | NOPOWER)) return
if ( (get_dist(src, user) > 1 ))
if (!istype(user, /mob/living/silicon/ai))
user.unset_machine()
user << browse(null, "window=solcon")
return
add_fingerprint(user)
user.set_machine(src)
var/t = "<TT><B>Solar Generator Control</B><HR><PRE>"
t += "Generated power : [round(lastgen)] W<BR><BR>"
t += "<B>Orientation</B>: [rate_control(src,"cdir","[cdir]&deg",1,15)] ([angle2text(cdir)])<BR><BR><BR>"
t += "<BR><HR><BR><BR>"
t += "Tracking: "
switch(track)
if(0)
t += "<B>Off</B> <A href='?src=\ref[src];track=1'>Timed</A> <A href='?src=\ref[src];track=2'>Auto</A><BR>"
if(1)
t += "<A href='?src=\ref[src];track=0'>Off</A> <B>Timed</B> <A href='?src=\ref[src];track=2'>Auto</A><BR>"
if(2)
t += "<A href='?src=\ref[src];track=0'>Off</A> <A href='?src=\ref[src];track=1'>Timed</A> <B>Auto</B><BR>"
t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",5,30,180)]<BR><BR>"
t += "<A href='?src=\ref[src];close=1'>Close</A></TT>"
user << browse(t, "window=solcon")
onclose(user, "solcon")
/obj/machinery/power/solar_control/Topic(href, href_list)
if(..())
usr << browse(null, "window=solcon")
usr.unset_machine()
return
if(href_list["close"] )
usr << browse(null, "window=solcon")
usr.unset_machine()
return
if(href_list["dir"])
cdir = text2num(href_list["dir"])
set_panels(cdir)
update_icon()
Topic(href, href_list)
if(..())
usr << browse(null, "window=solcon")
usr.unset_machine()
return
if(href_list["close"] )
usr << browse(null, "window=solcon")
usr.unset_machine()
return
if(href_list["dir"])
cdir = text2num(href_list["dir"])
if(href_list["rate control"])
if(href_list["cdir"])
src.cdir = dd_range(0,359,(360+src.cdir+text2num(href_list["cdir"]))%360)
spawn(1)
set_panels(cdir)
updateicon()
if(href_list["rate control"])
if(href_list["cdir"])
src.cdir = dd_range(0,359,(360+src.cdir+text2num(href_list["cdir"]))%360)
spawn(1)
set_panels(cdir)
updateicon()
if(href_list["tdir"])
src.trackrate = dd_range(-7200,7200,src.trackrate+text2num(href_list["tdir"]))
if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate)
if(href_list["track"])
update_icon()
if(href_list["tdir"])
src.trackrate = dd_range(-7200,7200,src.trackrate+text2num(href_list["tdir"]))
if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate)
track = text2num(href_list["track"])
if(powernet && (track == 2))
var/obj/machinery/power/tracker/T = locate() in powernet.nodes
if(T)
if(href_list["track"])
if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate)
track = text2num(href_list["track"])
if(powernet && (track == 2))
for(var/obj/machinery/power/tracker/T in get_solars_powernet())
if(powernet.nodes[T])
cdir = T.sun_angle
break
set_panels(cdir)
updateicon()
src.updateUsrDialog()
return
set_panels(cdir)
update_icon()
src.updateUsrDialog()
return
set_panels(var/cdir)
if(!powernet) return
for(var/obj/machinery/power/solar/S in powernet.nodes)
if(S.id != id) continue
if(!S.control)
S.control = src
S.ndir = cdir
/obj/machinery/power/solar_control/proc/set_panels(var/cdir)
if(!powernet) return
for(var/obj/machinery/power/solar/S in get_solars_powernet())
if(powernet.nodes[S])
if(get_dist(S, src) < SOLAR_MAX_DIST)
if(!S.control)
S.control = src
S.ndir = cdir
power_change()
if(powered())
stat &= ~NOPOWER
updateicon()
else
spawn(rand(0, 15))
stat |= NOPOWER
updateicon()
/obj/machinery/power/solar_control/power_change()
if(powered())
stat &= ~NOPOWER
update_icon()
else
spawn(rand(0, 15))
stat |= NOPOWER
update_icon()
/obj/machinery/power/solar_control/proc/broken()
stat |= BROKEN
update_icon()
/obj/machinery/power/solar_control/meteorhit()
broken()
stat |= BROKEN
updateicon()
return
meteorhit()
/obj/machinery/power/solar_control/ex_act(severity)
switch(severity)
if(1.0)
//SN src = null
del(src)
return
if(2.0)
if (prob(50))
broken()
if(3.0)
if (prob(25))
broken()
return
/obj/machinery/power/solar_control/blob_act()
if (prob(75))
broken()
return
src.density = 0
ex_act(severity)
switch(severity)
if(1.0)
//SN src = null
del(src)
return
if(2.0)
if (prob(50))
broken()
if(3.0)
if (prob(25))
broken()
return
//
// MISC
//
blob_act()
if (prob(75))
broken()
src.density = 0
/obj/item/weapon/paper/solar
name = "paper- 'Going green! Setup your own solar array instructions.'"
info = "<h1>Welcome</h1><p>At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.</p><p>You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!.</p><p>Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.</p><p>Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.</p><p>That's all to it, be safe, be green!</p>"
+47 -5
View File
@@ -11,9 +11,27 @@
anchored = 1
density = 1
directwired = 1
use_power = 0
var/sun_angle = 0 // sun angle as set by sun datum
/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S)
..(loc)
if(!S)
S = new /obj/item/solar_assembly(src)
S.glass_type = /obj/item/stack/sheet/glass
S.tracker = 1
S.anchored = 1
S.loc = src
connect_to_network()
/obj/machinery/power/tracker/disconnect_from_network()
..()
solars_list.Remove(src)
/obj/machinery/power/tracker/connect_to_network()
..()
solars_list.Add(src)
// called by datum/sun/calc_position() as sun's angle changes
/obj/machinery/power/tracker/proc/set_angle(var/angle)
@@ -30,13 +48,31 @@
// currently, just update all controllers in world
// ***TODO: better communication system using network
if(powernet)
for(var/obj/machinery/power/solar_control/C in powernet.nodes)
C.tracker_update(angle)
for(var/obj/machinery/power/solar_control/C in get_solars_powernet())
if(powernet.nodes[C])
if(get_dist(C, src) < SOLAR_MAX_DIST)
C.tracker_update(angle)
/obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user)
if(iscrowbar(W))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 50))
var/obj/item/solar_assembly/S = locate() in src
if(S)
S.loc = src.loc
S.give_glass()
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("<span class='notice'>[user] takes the glass off the tracker.</span>")
del(src)
return
..()
// timed process
// make sure we can draw power from the powernet
/obj/machinery/power/tracker/process()
var/avail = surplus()
if(avail > 500)
@@ -45,6 +81,12 @@
else
stat |= NOPOWER
// override power change to do nothing since we don't care about area power
/obj/machinery/power/tracker/power_change()
return
// Tracker Electronic
/obj/item/weapon/tracker_electronics
name = "tracker electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
w_class = 2.0
+2 -2
View File
@@ -58,7 +58,7 @@
/obj/machinery/compressor/process()
if(!starter)
return
overlays = null
overlays.Cut()
if(stat & BROKEN)
return
if(!turbine)
@@ -113,7 +113,7 @@
/obj/machinery/power/turbine/process()
if(!compressor.starter)
return
overlays = null
overlays.Cut()
if(stat & BROKEN)
return
if(!compressor)