Merge remote-tracking branch 'upstream/dev' into TheGreatEvents

Conflicts:
	code/modules/events/radiation_storm.dm
This commit is contained in:
PsiOmega
2014-11-05 14:33:33 +01:00
104 changed files with 1394 additions and 647 deletions

View File

@@ -312,6 +312,7 @@
#include "code\game\machinery\holosign.dm"
#include "code\game\machinery\igniter.dm"
#include "code\game\machinery\iv_drip.dm"
#include "code\game\machinery\jukebox.dm"
#include "code\game\machinery\lightswitch.dm"
#include "code\game\machinery\machinery.dm"
#include "code\game\machinery\magnet.dm"
@@ -393,6 +394,7 @@
#include "code\game\machinery\doors\checkForMultipleDoors.dm"
#include "code\game\machinery\doors\door.dm"
#include "code\game\machinery\doors\firedoor.dm"
#include "code\game\machinery\doors\firedoor_assembly.dm"
#include "code\game\machinery\doors\multi_tile.dm"
#include "code\game\machinery\doors\poddoor.dm"
#include "code\game\machinery\doors\shutters.dm"

View File

@@ -163,8 +163,10 @@
R.ResetSecurityCodes()
else
message_admins("\blue [key_name_admin(usr)] detonated [R.name]!")
log_game("\blue [key_name_admin(usr)] detonated [R.name]!")
message_admins("<span class='notice'>[key_name_admin(usr)] detonated [key_name(R.name)]!</span>")
log_game("<span class='notice'>[key_name_admin(usr)] detonated [key_name(R.name)]!</span>")
if(R.connected_ai)
R.connected_ai << "<br><br><span class='alert'>ALERT - Cyborg kill-switch activated: [R.name]</span><br>"
R.self_destruct()
else
usr << "\red Access Denied."
@@ -176,16 +178,14 @@
var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm")
if(R && istype(R))
message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
message_admins("<span class='notice'>[key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!</span>")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R.name)]!")
R.canmove = !R.canmove
if (R.lockcharge)
// R.cell.charge = R.lockcharge
R.lockcharge = !R.lockcharge
R << "Your lockdown has been lifted!"
else
R.lockcharge = !R.lockcharge
// R.cell.charge = 0
R << "You have been locked down!"
else

View File

@@ -45,8 +45,20 @@
return heard
/proc/isStationLevel(var/level)
return level in config.station_levels
/proc/isNotStationLevel(var/level)
return !isStationLevel()
/proc/isPlayerLevel(var/level)
return level in config.player_levels
/proc/isAdminLevel(var/level)
return level in config.admin_levels
/proc/isNotAdminLevel(var/level)
return !isAdminLevel(level)
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
//They should approximate pythagoras theorem well enough for our needs.

View File

@@ -152,6 +152,7 @@
var/use_overmap = 0
var/list/station_levels = list(1) // Defines which Z-levels the station exists on.
var/list/admin_levels= list(2) // Defines which Z-levels which are for admin functionality, for example including such areas as Central Command and the Syndicate Shuttle
var/list/contact_levels = list(1, 5) // Defines which Z-levels which, for example, a Code Red announcement may affect
var/list/player_levels = list(1, 3, 4, 5, 6) // Defines all Z-levels a character can typically reach
@@ -532,6 +533,9 @@
if("station_levels")
config.station_levels = text2numlist(value, ";")
if("admin_levels")
config.admin_levels = text2numlist(value, ";")
if("contact_levels")
config.contact_levels = text2numlist(value, ";")

View File

@@ -56,6 +56,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
var/air_doors_activated = 0
var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
var/sound/forced_ambience = null
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
@@ -717,6 +718,10 @@ var/list/ghostteleportlocs = list()
name = "\improper Incinerator"
icon_state = "disposal"
/area/maintenance/library
name = "Library Maintenance"
icon_state = "maint_library"
/area/maintenance/locker
name = "Locker Room Maintenance"
icon_state = "maint_locker"
@@ -726,11 +731,11 @@ var/list/ghostteleportlocs = list()
icon_state = "maint_medbay"
/area/maintenance/research_port
name = "Port Research Maintenance"
name = "Research Maintenance - Port"
icon_state = "maint_research_port"
/area/maintenance/research_starboard
name = "Starboard Research Maintenance"
name = "Research Maintenance - Starboard"
icon_state = "maint_research_starboard"
/area/maintenance/research_shuttle
@@ -738,11 +743,11 @@ var/list/ghostteleportlocs = list()
icon_state = "maint_research_shuttle"
/area/maintenance/security_port
name = "Port Security Maintenance"
name = "Security Maintenance - Port"
icon_state = "maint_security_port"
/area/maintenance/security_starboard
name = "Starboard Security Maintenance"
name = "Security Maintenance - Starboard"
icon_state = "maint_security_starboard"
/area/maintenance/storage
@@ -814,9 +819,21 @@ var/list/ghostteleportlocs = list()
name = "\improper Construction Area"
icon_state = "construction"
/area/hallway/secondary/entry
name = "\improper Arrival Shuttle Hallway"
icon_state = "entry"
/area/hallway/secondary/entry/fore
name = "\improper Arrival Shuttle Hallway - Fore"
icon_state = "entry_1"
/area/hallway/secondary/entry/port
name = "\improper Arrival Shuttle Hallway - Port"
icon_state = "entry_2"
/area/hallway/secondary/entry/starboard
name = "\improper Arrival Shuttle Hallway - Starboard"
icon_state = "entry_3"
/area/hallway/secondary/entry/aft
name = "\improper Arrival Shuttle Hallway - Aft"
icon_state = "entry_4"
//Command
@@ -1175,7 +1192,7 @@ var/list/ghostteleportlocs = list()
/area/assembly/robotics
name = "\improper Robotics Lab"
icon_state = "ass_line"
icon_state = "robotics"
/area/assembly/assembly_line //Derelict Assembly Line
name = "\improper Assembly Line"

View File

@@ -282,10 +282,9 @@
master.used_environ += amount
/area/Entered(A)
var/musVolume = 25
var/sound = 'sound/ambience/ambigen1.ogg'
var/list/mob/living/forced_ambiance_list = new
/area/Entered(A)
if(!istype(A,/mob/living)) return
var/mob/living/L = A
@@ -300,18 +299,28 @@
L.make_floating(0)
L.lastarea = newarea
play_ambience(L)
/area/proc/play_ambience(var/mob/living/L)
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(!(L && L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return
// If we previously were in an area with force-played ambiance, stop it.
if(L in forced_ambiance_list)
L << sound(null, channel = 1)
forced_ambiance_list -= L
if(!L.client.ambience_playing)
L.client.ambience_playing = 1
L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
if(src.ambience.len && prob(35))
sound = pick(ambience)
if(world.time > L.client.played + 600)
if(forced_ambience)
forced_ambiance_list += L
L << forced_ambience
else if(src.ambience.len && prob(35))
if((world.time >= L.client.played + 600))
var/musVolume = 25
var/sound = pick(ambience)
L << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1)
L.client.played = world.time

View File

@@ -82,7 +82,7 @@ var/list/blob_nodes = list()
sleep(-1)
if(!blobs.len) break
var/obj/effect/blob/B = pick(blobs)
if(B.z != 1)
if(isNotStationLevel(B.z))
continue
B.Life()

View File

@@ -7,12 +7,12 @@
return 1
for(var/obj/effect/blob/B in blob_cores)
if(B && B.z != 1) continue
if(B && isNotStationLevel(B.z)) continue
return 0
var/nodes = 0
for(var/obj/effect/blob/B in blob_nodes)
if(B && B.z != 1) continue
if(B && isNotStationLevel(B.z)) continue
nodes++
if(nodes > 4)//Perhapse make a new core with a low prob
return 0
@@ -62,7 +62,7 @@
if (istype(T, /turf/space))
numSpace += 1
else if(istype(T, /turf))
if (M.z!=1)
if (isNotStationLevel(M.z))
numOffStation += 1
else
numAlive += 1

View File

@@ -62,7 +62,7 @@
proc/count()
for(var/turf/T in world)
if(T.z != 1)
if(isNotStationLevel(T.z)
continue
if(istype(T,/turf/simulated/floor))
@@ -84,7 +84,7 @@
src.r_wall += 1
for(var/obj/O in world)
if(O.z != 1)
if(isNotStationLevel(O.z))
continue
if(istype(O, /obj/structure/window))

View File

@@ -12,7 +12,7 @@ var/list/sacrificed = list()
for(var/obj/effect/rune/R in world)
if(R == src)
continue
if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != 2)
if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && isPlayerLevel(R.z))
index++
allrunesloc.len = index
allrunesloc[index] = R.loc

View File

@@ -151,7 +151,7 @@
var/turf/T = get_turf(H)
if(!T)
continue
if(T.z != 1)
if(isNotStationLevel(T.z))
continue
for(var/datum/disease/D in H.viruses)
foundAlready = 1
@@ -211,7 +211,7 @@
/* // Haha, this is way too laggy. I'll keep the prison break though.
for(var/obj/machinery/light/L in world)
if(L.z != 1) continue
if(isNotStationLevel(L.z)) continue
L.flicker(50)
sleep(100)
@@ -220,7 +220,7 @@
var/turf/T = get_turf(H)
if(!T)
continue
if(T.z != 1)
if(isNotStationLevel(T.z))
continue
if(istype(H,/mob/living/carbon/human))
H.apply_effect((rand(15,75)),IRRADIATE,0)
@@ -237,7 +237,7 @@
var/turf/T = get_turf(M)
if(!T)
continue
if(T.z != 1)
if(isNotStationLevel(T.z))
continue
M.apply_effect((rand(15,75)),IRRADIATE,0)
sleep(100)

View File

@@ -78,8 +78,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
walk_towards(immrod, end,1)
sleep(1)
while (immrod)
if (immrod.z != 1)
immrod.z = 1
if (isNotStationLevel(immrod.z))
immrod.z = pick(config.station_levels)
if(immrod.loc == end)
del(immrod)
sleep(10)

View File

@@ -83,7 +83,7 @@ The "dust" will damage the hull of the station causin minor hull breaches.
var/goal = locate(endx, endy, 1)
src.x = startx
src.y = starty
src.z = 1
src.z = pick(config.station_levels)
spawn(0)
walk_towards(src, goal, 1)
return

View File

@@ -1,6 +1,6 @@
/proc/Christmas_Game_Start()
for(var/obj/structure/flora/tree/pine/xmas in world)
if(xmas.z != 1) continue
if(isNotStationLevel(xmas.z)) continue
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
new /obj/item/weapon/a_gift(T)

View File

@@ -171,7 +171,7 @@ var/global/Holiday = null
*/
/* var/list/obj/containers = list()
for(var/obj/item/weapon/storage/S in world)
if(S.z != 1) continue
if(isNotStationLevel(S.z)) continue
containers += S
message_admins("\blue DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z])")*/

View File

@@ -21,7 +21,7 @@
sleep(-1)
if(!blob_cores.len) break
var/obj/effect/blob/B = pick(blob_cores)
if(B.z != 1)
if(isNotStationLevel(B.z))
continue
B.Life()
spawn(30)

View File

@@ -33,7 +33,7 @@
C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in world)
var/area/current_area = get_area(S)
if(current_area.type in skipped_areas || S.z != 1)
if(current_area.type in skipped_areas || isNotStationLevel(S.z))
continue
S.charge = S.last_charge
S.output = S.last_output
@@ -46,7 +46,7 @@
if(announce)
command_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in world)
if(S.z != 1)
if(isNotStationLevel(S.z))
continue
S.charge = S.capacity
S.output = 200000

View File

@@ -382,11 +382,11 @@ var/global/datum/controller/gameticker/ticker
if(Player.stat != DEAD)
var/turf/playerTurf = get_turf(Player)
if(emergency_shuttle.departed && emergency_shuttle.evac)
if(playerTurf.z != 2)
if(isNotAdminLevel(playerTurf.z))
Player << "<font color='blue'><b>You managed to survive, but were marooned on [station_name()] as [Player.real_name]...</b></font>"
else
Player << "<font color='green'><b>You managed to survive the events on [station_name()] as [Player.real_name].</b></font>"
else if(playerTurf.z == 2)
else if(isAdminLevel(playerTurf.z))
Player << "<font color='green'><b>You successfully underwent crew transfer after events on [station_name()] as [Player.real_name].</b></font>"
else if(issilicon(Player))
Player << "<font color='green'><b>You remain operational after the events on [station_name()] as [Player.real_name].</b></font>"

View File

@@ -1404,7 +1404,7 @@ datum
var/turf/T = get_turf(target.current)
if(target.current.stat == 2)
return 1
else if((T) && (T.z != 1))//If they leave the station they count as dead for this
else if((T) && (isNotStationLevel(T.z)))//If they leave the station they count as dead for this
return 2
else
return 0

View File

@@ -88,7 +88,7 @@ datum/objective/mutiny
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey)
return 1
var/turf/T = get_turf(target.current)
if(T && (T.z != 1)) //If they leave the station they count as dead for this
if(T && isNotStationLevel(T.z)) //If they leave the station they count as dead for this
return 2
return 0
return 1
@@ -123,7 +123,7 @@ datum/objective/mutiny/rp
if(target in ticker.mode:head_revolutionaries)
return 1
var/turf/T = get_turf(target.current)
if(T && (T.z != 1)) //If they leave the station they count as dead for this
if(T && isNotStationLevel(T.z)) //If they leave the station they count as dead for this
rval = 2
return 0
return rval

View File

@@ -367,7 +367,7 @@
if(headrev.current)
if(headrev.current.stat == DEAD)
text += "died"
else if(headrev.current.z != 1)
else if(isNotStationLevel(headrev.current.z))
text += "fled the station"
else
text += "survived the revolution"
@@ -390,7 +390,7 @@
if(rev.current)
if(rev.current.stat == DEAD)
text += "died"
else if(rev.current.z != 1)
else if(isNotStationLevel(rev.current.z))
text += "fled the station"
else
text += "survived the revolution"
@@ -415,7 +415,7 @@
if(head.current)
if(head.current.stat == DEAD)
text += "died"
else if(head.current.z != 1)
else if(isNotStationLevel(head.current.z))
text += "fled the station"
else
text += "survived the revolution"

View File

@@ -34,7 +34,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
captain_announcement.Announce("All hands, captain [H.real_name] on deck!")
var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20)
captain_announcement.Announce("All hands, Captain [H.real_name] on deck!", new_sound=announce_sound)
H.implant_loyalty(src)

View File

@@ -103,6 +103,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
var/obj/item/weapon/airlock_electronics/electronics = null
var/hasShocked = 0 //Prevents multiple shocks from happening
var/secured_wires = 0 //for mapping use
var/security_bolts = 0 //if 1, door bolts when broken
var/list/airlockIndexToFlag
var/list/airlockWireColorToFlag
var/list/airlockIndexToWireColor
@@ -141,6 +142,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass
name = "Glass Airlock"
icon = 'icons/obj/doors/Doorglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
glass = 1
@@ -153,6 +156,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
name = "Vault"
icon = 'icons/obj/doors/vault.dmi'
opacity = 1
security_bolts = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites.
/obj/machinery/door/airlock/freezer
@@ -176,6 +180,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass_command
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorcomglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_com
glass = 1
@@ -183,6 +189,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass_engineering
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorengglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_eng
glass = 1
@@ -190,6 +198,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass_security
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorsecglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_sec
glass = 1
@@ -197,6 +207,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass_medical
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doormedglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_med
glass = 1
@@ -219,6 +231,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass_research
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorresearchglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_research
glass = 1
@@ -227,6 +241,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass_mining
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Doorminingglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_min
glass = 1
@@ -234,6 +250,8 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/glass_atmos
name = "Maintenance Hatch"
icon = 'icons/obj/doors/Dooratmoglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 300
opacity = 0
assembly_type = /obj/structure/door_assembly/door_assembly_atmo
glass = 1
@@ -321,6 +339,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
/obj/machinery/door/airlock/highsecurity
name = "High Tech Security Airlock"
icon = 'icons/obj/doors/hightechsecurity.dmi'
security_bolts = 1
assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity
/*
@@ -546,7 +565,7 @@ About the new airlock wires panel:
return !(src.isWireCut(AIRLOCK_WIRE_IDSCAN) || aiDisabledIdScanner)
/obj/machinery/door/airlock/proc/isAllPowerLoss()
if(stat & NOPOWER)
if(stat & (NOPOWER|BROKEN))
return 1
if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1) || src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2))
if(src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1) || src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2))
@@ -619,10 +638,19 @@ About the new airlock wires panel:
overlays = list()
if(p_open)
overlays += image(icon, "panel_open")
if (!(stat & NOPOWER))
if(stat & BROKEN)
overlays += image(icon, "sparks_broken")
else if (health < maxhealth * 3/4)
overlays += image(icon, "sparks_damaged")
if(welded)
overlays += image(icon, "welded")
else if (health < maxhealth * 3/4 && !(stat & NOPOWER))
overlays += image(icon, "sparks_damaged")
else
icon_state = "door_open"
if((stat & BROKEN) && !(stat & NOPOWER))
overlays += image(icon, "sparks_open")
return
@@ -633,19 +661,24 @@ About the new airlock wires panel:
if(p_open)
spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond.
flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking
update_icon()
else
flick("door_opening", src)
flick("door_opening", src)//[stat ? "_stat":]
update_icon()
if("closing")
if(overlays) overlays.Cut()
if(p_open)
spawn(2)
flick("o_door_closing", src)
update_icon()
else
flick("door_closing", src)
update_icon()
if("spark")
if(density)
flick("door_spark", src)
if("deny")
if(density)
if(density && !(stat & (BROKEN|NOPOWER)))
flick("door_deny", src)
return
@@ -841,6 +874,7 @@ About the new airlock wires panel:
**/
if(src.p_open)
user.set_machine(src)
var/t1 = text("<B>Access Panel</B><br>\n")
@@ -1162,7 +1196,13 @@ About the new airlock wires panel:
else
return
else if(istype(C, /obj/item/weapon/screwdriver))
src.p_open = !( src.p_open )
if (src.p_open)
if (stat & BROKEN)
usr << "The airlock control panel is too damaged to be closed!"
else
src.p_open = 0
else
src.p_open = 1
src.update_icon()
else if(istype(C, /obj/item/weapon/wirecutters))
return src.attack_hand(user)
@@ -1173,7 +1213,7 @@ About the new airlock wires panel:
else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE
var/obj/item/weapon/pai_cable/cable = C
cable.plugin(src, user)
else if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe) )
else if(istype(C, /obj/item/weapon/crowbar))
var/beingcrowbarred = null
if(istype(C, /obj/item/weapon/crowbar) )
beingcrowbarred = 1 //derp, Agouri
@@ -1219,29 +1259,32 @@ About the new airlock wires panel:
del(src)
return
else if(arePowerSystemsOn())
else if(arePowerSystemsOn() && !(stat & BROKEN))
user << "\blue The airlock's motors resist your efforts to force it."
else if(locked)
user << "\blue The airlock's bolts prevent it from being forced."
else if( !welded && !operating )
if(density)
if(beingcrowbarred == 0) //being fireaxe'd
spawn(0) open(1)
else
spawn(0) close(1)
else if(istype(C, /obj/item/weapon/twohanded/fireaxe) && (!arePowerSystemsOn() || (stat & BROKEN)))
if(locked)
user << "\blue The airlock's bolts prevent it from being forced."
else if( !welded && !operating )
if(density)
var/obj/item/weapon/twohanded/fireaxe/F = C
if(F:wielded)
spawn(0) open(1)
else
user << "\red You need to be wielding the Fire axe to do that."
else
spawn(0) open(1)
else
if(beingcrowbarred == 0)
var/obj/item/weapon/twohanded/fireaxe/F = C
if(F:wielded)
spawn(0) close(1)
else
user << "\red You need to be wielding the Fire axe to do that."
else
spawn(0) close(1)
else
..()
@@ -1252,6 +1295,22 @@ About the new airlock wires panel:
ignite(is_hot(C))
..()
/obj/machinery/door/airlock/set_broken()
src.p_open = 1
stat |= BROKEN
if (src.security_bolts)
lock()
for (var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("[src.name]'s control panel bursts open, sparks spewing out!")
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
update_icon()
return
/obj/machinery/door/airlock/open(var/forced=0)
if( operating || welded || locked )
return 0
@@ -1357,6 +1416,11 @@ About the new airlock wires panel:
airlockIndexToWireColor = wire_assignments[3]
airlockWireColorToIndex = wire_assignments[4]
/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason
..()
update_icon()
/obj/machinery/door/airlock/proc/prison_open()
src.unlock()
src.open()

View File

@@ -23,6 +23,10 @@
var/normalspeed = 1
var/heat_proof = 0 // For glass airlocks/opacity firedoors
var/air_properties_vary_with_direction = 0
var/maxhealth = 500
var/health
var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon
var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon
//Multi-tile doors
dir = EAST
@@ -47,6 +51,8 @@
bound_width = world.icon_size
bound_height = width * world.icon_size
health = maxhealth
update_nearby_tiles(need_rebuild=1)
return
@@ -120,6 +126,24 @@
src.open()
return
/obj/machinery/door/bullet_act(var/obj/item/projectile/Proj)
if(Proj.damage)
take_damage(round(Proj.damage * 4))
..()
/obj/machinery/door/hitby(AM as mob|obj)
..()
visible_message("\red <B>[src.name] was hit by [AM].</B>", 1)
var/tforce = 0
if(ismob(AM))
tforce = 15
else
tforce = AM:throwforce
playsound(src.loc, hitsound, 100, 1)
take_damage(tforce)
//..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak
return
/obj/machinery/door/attack_ai(mob/user as mob)
return src.attack_hand(user)
@@ -146,22 +170,69 @@
user = null
if(!src.requiresID())
user = null
if(istype(I, /obj/item/stack/sheet/metal))
if(stat & BROKEN)
user << "\blue [src.name] is damaged beyond repair and must be reconstructed!"
return
if(health >= maxhealth)
user << "\blue Nothing to fix!"
return
var/obj/item/stack/sheet/metal/metalstack = I
var/health_per_sheet = 50
var/initialhealth = health
src.health = min(maxhealth, health + 100, health + (metalstack.amount * health_per_sheet))
user.visible_message("\The [user] patches some dents on \the [src] with \the [metalstack].")
metalstack.use(round((health - initialhealth)/health_per_sheet))
return
if(src.density && ((operable() && istype(I, /obj/item/weapon/card/emag)) || istype(I, /obj/item/weapon/melee/energy/blade)))
flick("door_spark", src)
sleep(6)
open()
operating = -1
return 1
if(src.allowed(user))
if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card))
var/obj/item/weapon/W = I
if(W.damtype == BRUTE || W.damtype == BURN)
if(W.force < min_force)
user.visible_message("\red <B>\The [user] hits \the [src] with \the [W] with no visible effect.</B>" )
else
user.visible_message("\red <B>\The [user] forcefully slams \the [src] with \the [W]!</B>" )
playsound(src.loc, hitsound, 100, 1)
take_damage(W.force)
return
if(src.allowed(user) && operable())
if(src.density)
open()
else
close()
return
if(src.density)
if(src.density && !(stat & (NOPOWER|BROKEN)))
flick("door_deny", src)
return
/obj/machinery/door/proc/take_damage(var/damage)
var/initialhealth = src.health
src.health = max(0, src.health - damage)
if(src.health <= 0 && initialhealth > 0)
src.set_broken()
else if(src.health < src.maxhealth / 4 && initialhealth >= src.maxhealth / 4)
visible_message("\The [src] looks like it's about to break!" )
else if(src.health < src.maxhealth / 2 && initialhealth >= src.maxhealth / 2)
visible_message("\The [src] looks seriously damaged!" )
else if(src.health < src.maxhealth * 3/4 && initialhealth >= src.maxhealth * 3/4)
visible_message("\The [src] shows signs of damage!" )
update_icon()
return
/obj/machinery/door/proc/set_broken()
stat |= BROKEN
for (var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("[src.name] breaks!" )
update_icon()
return
/obj/machinery/door/blob_act()
if(prob(40))
@@ -187,11 +258,15 @@
if(2.0)
if(prob(25))
del(src)
else
take_damage(300)
if(3.0)
if(prob(80))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
else
take_damage(150)
return
@@ -293,7 +368,7 @@
/obj/machinery/door/proc/autoclose()
var/obj/machinery/door/airlock/A = src
if(!A.density && !A.operating && !A.locked && !A.welded && A.autoclose)
if(!A.density && !A.operating && !A.locked && !A.welded && !(A.stat & (BROKEN|NOPOWER)) && A.autoclose)
close()
return

View File

@@ -32,6 +32,8 @@
var/list/users_to_open = new
var/next_process_time = 0
var/hatch_open = 0
power_channel = ENVIRON
use_power = 1
idle_power_usage = 5
@@ -199,6 +201,33 @@
update_icon()
return
if(density && istype(C, /obj/item/weapon/screwdriver))
hatch_open = !hatch_open
user.visible_message("<span class='danger'>[user] has [hatch_open ? "opened" : "closed"] \the [src] maintenance hatch.</span>",
"You have [hatch_open ? "opened" : "closed"] the [src] maintenance hatch.")
update_icon()
return
if(blocked && istype(C, /obj/item/weapon/crowbar))
if(!hatch_open)
user << "<span class='danger'>You must open the maintenance hatch first!</span>"
else
user.visible_message("<span class='danger'>[user] is removing the electronics from \the [src].</span>",
"You start to remove the electronics from [src].")
if(do_after(user,30))
if(blocked && density && hatch_open)
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("<span class='danger'>[user] has removed the electronics from \the [src].</span>",
"You have removed the electronics from [src].")
new/obj/item/weapon/airalarm_electronics(src.loc)
var/obj/structure/firedoor_assembly/FA = new/obj/structure/firedoor_assembly(src.loc)
FA.anchored = 1
FA.density = 1
FA.update_icon()
del(src)
return
if(blocked)
user << "<span class='danger'>\The [src] is welded solid!</span>"
return
@@ -302,6 +331,11 @@
return ..()
/obj/machinery/door/firedoor/open(var/forced = 0)
if(hatch_open)
hatch_open = 0
visible_message("The maintenance hatch of \the [src] closes.")
update_icon()
if(!forced)
if(stat & (BROKEN|NOPOWER))
return //needs power to open unless it was forced
@@ -326,6 +360,8 @@
overlays.Cut()
if(density)
icon_state = "door_closed"
if(hatch_open)
overlays += "hatch"
if(blocked)
overlays += "welded"
if(pdiff_alert)

View File

@@ -0,0 +1,48 @@
obj/structure/firedoor_assembly
name = "\improper emergency shutter assembly"
desc = "It can save lives."
icon = 'icons/obj/doors/DoorHazard.dmi'
icon_state = "door_construction"
anchored = 0
opacity = 0
density = 0
obj/structure/firedoor_assembly/update_icon()
if(anchored)
icon_state = "door_anchored"
else
icon_state = "door_construction"
obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob)
if(istype(C, /obj/item/weapon/airalarm_electronics))
if(anchored)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] has inserted a circuit into \the [src]!</span>",
"You have inserted the circuit into \the [src]!")
new /obj/machinery/door/firedoor(src.loc)
del(C)
del(src)
else
user << "<span class='warning'>You must secure \the [src] first!</span>"
else if(istype(C, /obj/item/weapon/wrench))
anchored = !anchored
density = !density
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message("<span class='warning'>[user] has [anchored ? "" : "un" ]secured \the [src]!</span>",
"You have [anchored ? "" : "un" ]secured \the [src]!")
update_icon()
else if(!anchored && istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user))
user.visible_message("<span class='warning'>[user] dissassembles \the [src].</span>",
"You start to dissassemble \the [src].")
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user.visible_message("<span class='warning'>[user] has dissassembled \the [src].</span>",
"You have dissassembled \the [src].")
new /obj/item/stack/sheet/metal(src.loc, 2)
del (src)
else
user << "<span class='notice'>You need more welding fuel.</span>"
else
..(C, user)

View File

@@ -4,7 +4,10 @@
icon = 'icons/obj/doors/windoor.dmi'
icon_state = "left"
var/base_state = "left"
var/health = 150.0 //If you change this, consiter changing ../door/window/brigdoor/ health at the bottom of this .dm file
min_force = 4
hitsound = 'sound/effects/Glasshit.ogg'
maxhealth = 150 //If you change this, consiter changing ../door/window/brigdoor/ health at the bottom of this .dm file
health
visible = 0.0
use_power = 0
flags = ON_BORDER
@@ -122,7 +125,7 @@
src.operating = 0
return 1
/obj/machinery/door/window/proc/take_damage(var/damage)
/obj/machinery/door/window/take_damage(var/damage)
src.health = max(0, src.health - damage)
if (src.health <= 0)
new /obj/item/weapon/shard(src.loc)
@@ -149,27 +152,6 @@
del(src)
return
/obj/machinery/door/window/bullet_act(var/obj/item/projectile/Proj)
if(Proj.damage)
take_damage(round(Proj.damage / 2))
..()
//When an object is thrown at the window
/obj/machinery/door/window/hitby(AM as mob|obj)
..()
visible_message("\red <B>The glass door was hit by [AM].</B>", 1)
var/tforce = 0
if(ismob(AM))
tforce = 40
else
tforce = AM:throwforce
playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
take_damage(tforce)
//..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak
return
/obj/machinery/door/window/attack_ai(mob/user as mob)
return src.attack_hand(user)

View File

@@ -0,0 +1,207 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
datum/track
var/title
var/sound
datum/track/New(var/title_name, var/audio)
title = title_name
sound = audio
/obj/machinery/media/jukebox/
name = "space jukebox"
icon = 'icons/obj/jukebox.dmi'
icon_state = "jukebox2-nopower"
var/state_base = "jukebox2"
anchored = 1
density = 1
power_channel = EQUIP
var/playing = 0
var/datum/track/current_track
var/list/datum/track/tracks = list(
new/datum/track("Beyond", 'sound/ambience/ambispace.ogg'),
new/datum/track("Clouds of Fire", 'sound/music/clouds.s3m'),
new/datum/track("D`Bert", 'sound/music/title2.ogg'),
new/datum/track("D`Fort", 'sound/ambience/song_game.ogg'),
new/datum/track("Floating", 'sound/music/main.ogg'),
new/datum/track("Endless Space", 'sound/music/space.ogg'),
new/datum/track("Part A", 'sound/misc/TestLoop1.ogg'),
new/datum/track("Scratch", 'sound/music/title1.ogg'),
new/datum/track("Trai`Tor", 'sound/music/traitor.ogg'),
)
/obj/machinery/media/jukebox/Del()
StopPlaying()
/obj/machinery/media/jukebox/power_change()
if(!powered(power_channel) || !anchored)
stat |= NOPOWER
else
stat &= ~NOPOWER
if(stat & (NOPOWER|BROKEN) && playing)
StopPlaying()
update_icon()
/obj/machinery/media/jukebox/update_icon()
overlays.Cut()
if(stat & (NOPOWER|BROKEN) || !anchored)
if(stat & BROKEN)
icon_state = "[state_base]-broken"
else
icon_state = "[state_base]-nopower"
return
icon_state = state_base
if(playing)
if(emagged)
overlays += "[state_base]-emagged"
else
overlays += "[state_base]-running"
/obj/machinery/media/jukebox/Topic(href, href_list)
if(..() || !(Adjacent(usr) || istype(usr, /mob/living/silicon)))
return
if(!anchored)
usr << "<span class='warning'>You must secure \the [src] first.</span>"
return
if(stat & (NOPOWER|BROKEN))
usr << "\the [src] doesn't appear to function."
return
if(href_list["change_track"])
for(var/datum/track/T in tracks)
if(T.title == href_list["title"])
current_track = T
StartPlaying()
break
else if(href_list["stop"])
StopPlaying()
else if(href_list["play"])
if(emagged)
playsound(src.loc, 'sound/items/AirHorn.ogg', 100, 1)
for(var/mob/living/carbon/M in ohearers(6, src))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
continue
M.sleeping = 0
M.stuttering += 20
M.ear_deaf += 30
M.Weaken(3)
if(prob(30))
M.Stun(10)
M.Paralyse(4)
else
M.make_jittery(500)
spawn(15)
explode()
else if(current_track == null)
usr << "No track selected."
else
StartPlaying()
return 1
/obj/machinery/media/jukebox/interact(mob/user)
if(stat & (NOPOWER|BROKEN))
usr << "\the [src] doesn't appear to function."
return
ui_interact(user)
/obj/machinery/media/jukebox/ui_interact(mob/user, ui_key = "jukebox", var/datum/nanoui/ui = null, var/force_open = 1)
var/title = "RetroBox - Space Style"
var/data[0]
if(!(stat & (NOPOWER|BROKEN)))
data["current_track"] = current_track != null ? current_track.title : ""
data["playing"] = playing
var/list/nano_tracks = new
for(var/datum/track/T in tracks)
nano_tracks[++nano_tracks.len] = list("track" = T.title)
data["tracks"] = nano_tracks
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "jukebox.tmpl", title, 450, 600)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
/obj/machinery/media/jukebox/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/media/jukebox/attack_hand(var/mob/user as mob)
interact(user)
/obj/machinery/media/jukebox/proc/explode()
walk_to(src,0)
src.visible_message("<span class='danger'>\the [src] blows apart!</span>", 1)
explosion(src.loc, 0, 0, 1, rand(1,2), 1)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
new /obj/effect/decal/cleanable/blood/oil(src.loc)
del(src)
/obj/machinery/media/jukebox/attackby(obj/item/W as obj, mob/user as mob)
src.add_fingerprint(user)
if(istype(W, /obj/item/weapon/wrench))
if(playing)
StopPlaying()
user.visible_message("<span class='warning'>[user] has [anchored ? "un" : ""]secured \the [src].</span>", "<span class='notice'>You [anchored ? "un" : ""]secure \the [src].</span>")
anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
power_change()
update_icon()
return
if(istype(W, /obj/item/weapon/card/emag))
if(!emagged)
emagged = 1
StopPlaying()
visible_message("<span class='danger'>\the [src] makes a fizzling sound.</span>")
log_and_message_admins("emagged \the [src]")
update_icon()
return
return ..()
/obj/machinery/media/jukebox/proc/StopPlaying()
var/area/A = get_area(src)
// Always kill the current sound
for(var/mob/living/M in mobs_in_area(A))
M << sound(null, channel = 1)
A.forced_ambience = null
playing = 0
update_icon()
/obj/machinery/media/jukebox/proc/StartPlaying()
StopPlaying()
if(!current_track)
return
var/area/A = get_area(src)
A.forced_ambience = sound(current_track.sound, channel = 1, repeat = 1, volume = 25)
for(var/mob/living/M in mobs_in_area(A))
if(M.mind)
A.play_ambience(M)
playing = 1
update_icon()

View File

@@ -530,7 +530,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
for(var/datum/feed_channel/F in news_network.network_channels)
if( (!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
src.channel_name = strip_html(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels
src.updateUsrDialog()
else if(href_list["set_new_message"])

View File

@@ -173,11 +173,14 @@
energy_drain = 0
range = MELEE|RANGED
required_type = /obj/mecha/working
var/spray_particles = 5
var/spray_amount = 5 //units of liquid per particle. 5 is enough to wet the floor - it's a big fire extinguisher, so should be fine
var/max_water = 1000
New()
reagents = new/datum/reagents(200)
reagents = new/datum/reagents(max_water)
reagents.my_atom = src
reagents.add_reagent("water", 200)
reagents.add_reagent("water", max_water)
..()
return
@@ -188,8 +191,8 @@
if(do_after_cooldown(target))
if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1)
var/obj/o = target
o.reagents.trans_to(src, 200)
occupant_message("\blue Extinguisher refilled")
var/amount = o.reagents.trans_to(src, 200)
occupant_message("\blue [amount] units transferred into internal tank.")
playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6)
else
if(src.reagents.total_volume > 0)
@@ -200,16 +203,17 @@
var/turf/T2 = get_step(T,turn(direction, -90))
var/list/the_targets = list(T,T1,T2)
for(var/a=0, a<spray_particles, a++)
spawn(0)
for(var/a=0, a<5, a++)
var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(chassis))
if(!W)
return
var/turf/my_target = pick(the_targets)
var/datum/reagents/R = new/datum/reagents(5)
var/datum/reagents/R = new/datum/reagents(spray_amount)
W.reagents = R
R.my_atom = W
src.reagents.trans_to(W,1)
src.reagents.trans_to(W, spray_amount)
for(var/b=0, b<4, b++)
if(!W)
return
@@ -223,6 +227,7 @@
if(W.loc == my_target)
break
sleep(2)
W.delete()
return 1
get_equip_info()

View File

@@ -1,7 +1,7 @@
/obj/mecha/medical/New()
..()
var/turf/T = get_turf(src)
if(T.z != 2)
if(isPlayerLevel(T.z))
new /obj/item/mecha_parts/mecha_tracking(src)
return

View File

@@ -6,7 +6,7 @@
/obj/mecha/working/New()
..()
var/turf/T = get_turf(src)
if(T.z != 2)
if(isPlayerLevel(T.z))
new /obj/item/mecha_parts/mecha_tracking(src)
return

View File

@@ -512,7 +512,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
index++
if(FM.img)
usr << browse_rsc(FM.img, "pda_news_tmp_photo_[feed["channel"]]_[index].png")
messages[++messages.len] = list("author" = FM.author, "body" = FM.body, "message_type" = FM.message_type, "has_image" = (FM.img != null), "index" = index)
// News stories are HTML-stripped but require newline replacement to be properly displayed in NanoUI
var/body = replacetext(FM.body, "\n", "<br>")
messages[++messages.len] = list("author" = FM.author, "body" = body, "message_type" = FM.message_type, "has_image" = (FM.img != null), "index" = index)
feed["messages"] = messages
data["feed"] = feed

View File

@@ -60,6 +60,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
), 4), \
null, \

View File

@@ -66,3 +66,16 @@
user << "<span class='notice'>Where are the lips on that?</span>"
//you can wipe off lipstick with paper! see code/modules/paperwork/paper.dm, paper/attack()
/obj/item/weapon/haircomb //sparklysheep's comb
name = "purple comb"
desc = "A pristine purple comb made from flexible plastic."
w_class = 1.0
icon_state = "purplecomb"
item_state = "purplecomb"
/obj/item/weapon/haircomb/attack_self(mob/user)
if(user.r_hand == src || user.l_hand == src)
user.visible_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy"))
return

View File

@@ -13,7 +13,10 @@
force = 10.0
matter = list("metal" = 90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
var/spray_particles = 6
var/spray_amount = 2 //units of liquid per particle
var/max_water = 120
var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
@@ -28,7 +31,9 @@
throwforce = 2
w_class = 2.0
force = 3.0
max_water = 30
max_water = 60
spray_particles = 6
spray_amount = 2
sprite_name = "miniFE"
/obj/item/weapon/extinguisher/New()
@@ -56,8 +61,8 @@
if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(src,target) <= 1)
var/obj/o = target
o.reagents.trans_to(src, 50)
user << "\blue \The [src] is now refilled"
var/amount = o.reagents.trans_to(src, 50)
user << "\blue You fill [src] with [amount] units of the contents of [target]."
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
@@ -111,16 +116,17 @@
var/list/the_targets = list(T,T1,T2)
for(var/a=0, a<5, a++)
for(var/a=0, a < spray_particles, a++)
spawn(0)
var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) )
var/turf/my_target = pick(the_targets)
var/datum/reagents/R = new/datum/reagents(5)
var/datum/reagents/R = new/datum/reagents(spray_amount)
if(!W) return
W.reagents = R
R.my_atom = W
if(!W || !src) return
src.reagents.trans_to(W,1)
src.reagents.trans_to(W, spray_amount)
for(var/b=0, b<5, b++)
step_towards(W,my_target)
if(!W) return

View File

@@ -7,7 +7,8 @@
pressure_resistance = 4*ONE_ATMOSPHERE
anchored = 1.0
flags = ON_BORDER
var/health = 14.0
var/maxhealth = 14.0
var/health
var/ini_dir = null
var/state = 2
var/reinf = 0
@@ -17,18 +18,48 @@
// var/icon/silicateIcon = null // the silicated icon
/obj/structure/window/proc/take_damage(var/damage = 0, var/sound_effect = 1)
var/initialhealth = src.health
src.health = max(0, src.health - damage)
if(src.health <= 0)
src.shatter()
else
if(sound_effect)
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
if(src.health < src.maxhealth / 4 && initialhealth >= src.maxhealth / 4)
visible_message("[src] looks like it's about to shatter!" )
else if(src.health < src.maxhealth / 2 && initialhealth >= src.maxhealth / 2)
visible_message("[src] looks seriously damaged!" )
else if(src.health < src.maxhealth * 3/4 && initialhealth >= src.maxhealth * 3/4)
visible_message("Cracks begin to appear in [src]!" )
return
/obj/structure/window/proc/shatter(var/display_message = 1)
playsound(src, "shatter", 70, 1)
if(display_message)
visible_message("[src] shatters!")
if(dir == SOUTHWEST)
var/index = null
index = 0
while(index < 2)
new shardtype(loc)
if(reinf) new /obj/item/stack/rods(loc)
index++
else
new shardtype(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
return
/obj/structure/window/bullet_act(var/obj/item/projectile/Proj)
//Tasers and the like should not damage windows.
if(Proj.damage_type == HALLOSS)
return
health -= Proj.damage
..()
if(health <= 0)
new /obj/item/weapon/shard(loc)
new /obj/item/stack/rods(loc)
del(src)
take_damage(Proj.damage * 4)
return
@@ -38,29 +69,20 @@
del(src)
return
if(2.0)
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
shatter(0)
return
if(3.0)
if(prob(50))
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
shatter(0)
return
/obj/structure/window/blob_act()
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
shatter()
/obj/structure/window/meteorhit()
//world << "glass at [x],[y],[z] Mhit"
new /obj/item/weapon/shard( loc )
if(reinf) new /obj/item/stack/rods( loc)
del(src)
shatter()
/obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
@@ -92,16 +114,11 @@
var/obj/item/I = AM
tforce = I.throwforce
if(reinf) tforce *= 0.25
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
health = max(0, health - tforce)
if(health <= 7 && !reinf)
if(health - tforce <= 7 && !reinf)
anchored = 0
update_nearby_icons()
step(src, get_dir(AM, src))
if(health <= 0)
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
take_damage(tforce)
/obj/structure/window/attack_tk(mob/user as mob)
user.visible_message("<span class='notice'>Something knocks on [src].</span>")
@@ -111,9 +128,7 @@
if(HULK in user.mutations)
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("<span class='danger'>[user] smashes through [src]!</span>")
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
shatter()
else if (usr.a_intent == "hurt")
@@ -140,15 +155,8 @@
/obj/structure/window/proc/attack_generic(mob/user as mob, damage = 0) //used by attack_animal and attack_slime
health -= damage
if(health <= 0)
user.visible_message("<span class='danger'>[user] smashes through [src]!</span>")
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
else //for nicer text~
user.visible_message("<span class='danger'>[user] smashes into [src]!</span>")
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
take_damage(damage)
/obj/structure/window/attack_animal(mob/user as mob)
if(!isanimal(user)) return
@@ -224,21 +232,7 @@
/obj/structure/window/proc/hit(var/damage, var/sound_effect = 1)
if(reinf) damage *= 0.5
health = max(0, health - damage)
if(sound_effect)
playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
if(health <= 0)
if(dir == SOUTHWEST)
var/index = null
index = 0
while(index < 2)
new shardtype(loc)
if(reinf) new /obj/item/stack/rods(loc)
index++
else
new shardtype(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
take_damage(damage)
return
@@ -297,6 +291,8 @@
// if(re) reinf = re
health = maxhealth
ini_dir = dir
update_nearby_tiles(need_rebuild=1)
@@ -308,7 +304,6 @@
/obj/structure/window/Del()
density = 0
update_nearby_tiles()
playsound(src, "shatter", 70, 1)
update_nearby_icons()
..()
@@ -385,7 +380,7 @@
basestate = "phoronwindow"
icon_state = "phoronwindow"
shardtype = /obj/item/weapon/shard/phoron
health = 120
maxhealth = 120
/obj/structure/window/phoronbasic/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > T0C + 32000)
@@ -399,7 +394,7 @@
icon_state = "phoronrwindow"
shardtype = /obj/item/weapon/shard/phoron
reinf = 1
health = 160
maxhealth = 160
/obj/structure/window/phoronreinforced/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
@@ -409,7 +404,7 @@
desc = "It looks rather strong. Might take a few good hits to shatter it."
icon_state = "rwindow"
basestate = "rwindow"
health = 40
maxhealth = 40
reinf = 1
/obj/structure/window/reinforced/tinted
@@ -424,7 +419,7 @@
desc = "It looks rather strong and frosted over. Looks like it might take a few less hits then a normal reinforced window."
icon_state = "fwindow"
basestate = "fwindow"
health = 30
maxhealth = 30
/obj/structure/window/shuttle
name = "shuttle window"
@@ -432,7 +427,7 @@
icon = 'icons/obj/podwindows.dmi'
icon_state = "window"
basestate = "window"
health = 40
maxhealth = 40
reinf = 1
dir = 5

View File

@@ -13,9 +13,11 @@
icon_state = "rockvault"
/turf/simulated/floor/airless/catwalk
name = "catwalk"
icon = 'icons/turf/catwalks.dmi'
icon_state = "catwalk0"
name = "catwalk"
floor_tile = null
intact = 0
/turf/simulated/floor/light
name = "Light floor"

View File

@@ -1283,11 +1283,11 @@
foo += text("<B>Is an AI</B> | ")
else
foo += text("<A HREF='?src=\ref[];makeai=\ref[]'>Make AI</A> | ", src, M)
if(M.z != 2)
if(isNotAdminLevel(M.z))
foo += text("<A HREF='?src=\ref[];sendtoprison=\ref[]'>Prison</A> | ", src, M)
foo += text("<A HREF='?src=\ref[];sendtomaze=\ref[]'>Maze</A> | ", src, M)
else
foo += text("<B>On Z = 2</B> | ")
foo += text("<B>On Z = [M.z]</B> | ")
else
foo += text("<B>Hasn't Entered Game</B> | ")
foo += text("<A HREF='?src=\ref[];revive=\ref[]'>Heal/Revive</A> | ", src, M)

View File

@@ -1,18 +1,45 @@
var/global/list/gear_datums = list()
/hook/startup/proc/populate_gear_list()
var/list/sort_categories = list(
"[slot_head]" = list(),
"[slot_glasses]" = list(),
"[slot_wear_mask]" = list(),
"[slot_w_uniform]" = list(),
"attachments" = list(),
"[slot_wear_suit]" = list(),
"[slot_gloves]" = list(),
"[slot_shoes]" = list(),
"utility" = list(),
"misc" = list(),
"unknown" = list(),
)
//create a list of gear datums to sort
for(var/type in typesof(/datum/gear)-/datum/gear)
var/datum/gear/G = new type()
gear_datums[G.display_name] = G
var/category = (G.sort_category in sort_categories)? G.sort_category : "unknown"
sort_categories[category][G.display_name] = G
for (var/category in sort_categories)
gear_datums.Add(sortAssoc(sort_categories[category]))
return 1
/datum/gear
var/display_name //Name/index.
var/display_name //Name/index. Must be unique.
var/path //Path to item.
var/cost //Number of points used.
var/slot //Slot to equip to.
var/list/allowed_roles //Roles that can spawn with this item.
var/whitelisted //Term to check the whitelist for..
var/sort_category
/datum/gear/New()
..()
if (!sort_category)
sort_category = "[slot]"
// This is sorted both by slot and alphabetically! Don't fuck it up!
// Headslot items
@@ -23,6 +50,12 @@ var/global/list/gear_datums = list()
cost = 2
slot = slot_head
/datum/gear/obandana
display_name = "bandana, orange"
path = /obj/item/clothing/head/orangebandana
cost = 2
slot = slot_head
/datum/gear/bandana
display_name = "bandana, pirate-red"
path = /obj/item/clothing/head/bandana
@@ -230,7 +263,7 @@ var/global/list/gear_datums = list()
/datum/gear/sterilemask
display_name = "sterile mask"
path = /obj/item/clothing/mask/surgical
slot = slot_w_uniform
slot = slot_wear_mask
cost = 2
// Uniform slot
@@ -260,7 +293,7 @@ var/global/list/gear_datums = list()
cost = 2
/datum/gear/skirt_red
display_name = " plaid skirt, red"
display_name = "plaid skirt, red"
path = /obj/item/clothing/under/dress/plaid_red
slot = slot_w_uniform
cost = 2
@@ -277,6 +310,12 @@ var/global/list/gear_datums = list()
slot = slot_w_uniform
cost = 3
/datum/gear/cheongsam
display_name = "cheongsam, white"
path = /obj/item/clothing/under/cheongsam
slot = slot_w_uniform
cost = 3
/datum/gear/uniform_captain
display_name = "uniform, captain's dress"
path = /obj/item/clothing/under/dress/dress_cap
@@ -324,74 +363,88 @@ var/global/list/gear_datums = list()
/datum/gear/armband_cargo
display_name = "armband, cargo"
path = /obj/item/clothing/tie/armband/cargo
sort_category = "attachments"
cost = 1
/datum/gear/armband_emt
display_name = "armband, EMT"
path = /obj/item/clothing/tie/armband/medgreen
sort_category = "attachments"
cost = 2
/datum/gear/armband_engineering
display_name = "armband, engineering"
path = /obj/item/clothing/tie/armband/engine
sort_category = "attachments"
cost = 1
/datum/gear/armband_hydroponics
display_name = "armband, hydroponics"
path = /obj/item/clothing/tie/armband/hydro
sort_category = "attachments"
cost = 1
/datum/gear/armband_medical
display_name = "armband, medical"
path = /obj/item/clothing/tie/armband/med
sort_category = "attachments"
cost = 1
/datum/gear/armband
display_name = "armband, red"
path = /obj/item/clothing/tie/armband
sort_category = "attachments"
cost = 1
/datum/gear/armband_science
display_name = "armband, science"
path = /obj/item/clothing/tie/armband/science
sort_category = "attachments"
cost = 1
/datum/gear/armpit
display_name = "shoulder holster"
path = /obj/item/clothing/tie/holster/armpit
sort_category = "attachments"
cost = 2
allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security")
/datum/gear/tie_blue
display_name = "tie, blue"
path = /obj/item/clothing/tie/blue
sort_category = "attachments"
cost = 1
/datum/gear/tie_red
display_name = "tie, red"
path = /obj/item/clothing/tie/red
sort_category = "attachments"
cost = 1
/datum/gear/tie_horrible
display_name = "tie, socially disgraceful"
path = /obj/item/clothing/tie/horrible
sort_category = "attachments"
cost = 1
/datum/gear/brown_vest
display_name = "webbing, engineering"
path = /obj/item/clothing/tie/storage/brown_vest
sort_category = "attachments"
cost = 2
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
/datum/gear/black_vest
display_name = "webbing, security"
path = /obj/item/clothing/tie/storage/black_vest
sort_category = "attachments"
cost = 2
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/webbing
display_name = "webbing, simple"
path = /obj/item/clothing/tie/storage/webbing
sort_category = "attachments"
cost = 2
// Suit slot
@@ -404,10 +457,40 @@ var/global/list/gear_datums = list()
/datum/gear/bomber
display_name = "bomber jacket"
path = /obj/item/clothing/suit/bomber
path = /obj/item/clothing/suit/storage/bomber
cost = 4
slot = slot_wear_suit
/datum/gear/leather_jacket
display_name = "leather jacket, black"
path = /obj/item/clothing/suit/storage/leather_jacket
cost = 3
slot = slot_wear_suit
/datum/gear/leather_jacket_nt
display_name = "leather jacket, NanoTrasen, black"
path = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen
cost = 3
slot = slot_wear_suit
/datum/gear/brown_jacket
display_name = "leather jacket, brown"
path = /obj/item/clothing/suit/storage/brown_jacket
cost = 3
slot = slot_wear_suit
/datum/gear/brown_jacket_nt
display_name = "leather jacket, NanoTrasen, brown"
path = /obj/item/clothing/suit/storage/brown_jacket/nanotrasen
cost = 3
slot = slot_wear_suit
/datum/gear/hoodie
display_name = "hoodie, grey"
path = /obj/item/clothing/suit/hoodie
cost = 2
slot = slot_wear_suit
/datum/gear/unathi_mantle
display_name = "hide mantle (Unathi)"
path = /obj/item/clothing/suit/unathi/mantle
@@ -430,31 +513,31 @@ var/global/list/gear_datums = list()
/datum/gear/gponcho
display_name = "poncho, blue"
path = /obj/item/clothing/suit/poncho/blue
cost = 4
cost = 3
slot = slot_wear_suit
/datum/gear/gponcho
display_name = "poncho, green"
path = /obj/item/clothing/suit/poncho/green
cost = 4
cost = 3
slot = slot_wear_suit
/datum/gear/rponcho
display_name = "poncho, purple"
path = /obj/item/clothing/suit/poncho/purple
cost = 4
cost = 3
slot = slot_wear_suit
/datum/gear/rponcho
display_name = "poncho, red"
path = /obj/item/clothing/suit/poncho/red
cost = 4
cost = 3
slot = slot_wear_suit
/datum/gear/poncho
display_name = "poncho, tan"
path = /obj/item/clothing/suit/poncho
cost = 4
cost = 3
slot = slot_wear_suit
/datum/gear/unathi_robe
@@ -613,16 +696,24 @@ var/global/list/gear_datums = list()
cost = 1
slot = slot_shoes
// "Useful" items
// "Useful" items - I'm guessing things that might be used at work?
/datum/gear/briefcase
display_name = "briefcase"
path = /obj/item/weapon/storage/briefcase
sort_category = "utility"
cost = 2
/datum/gear/clipboard
display_name = "clipboard"
path = /obj/item/weapon/clipboard
sort_category = "utility"
cost = 1
/datum/gear/matchbook
display_name = "matchbook"
path = /obj/item/weapon/storage/box/matches
sort_category = "utility"
cost = 2
// The rest of the trash.
@@ -630,49 +721,53 @@ var/global/list/gear_datums = list()
/datum/gear/ashtray
display_name = "ashtray, plastic"
path = /obj/item/ashtray/plastic
sort_category = "misc"
cost = 1
/datum/gear/cane
display_name = "cane"
path = /obj/item/weapon/cane
sort_category = "misc"
cost = 2
/datum/gear/clipboard
display_name = "clipboard"
path = /obj/item/weapon/clipboard
cost = 1
/datum/gear/dice
display_name = "d20"
path = /obj/item/weapon/dice/d20
sort_category = "misc"
cost = 1
/datum/gear/cards
display_name = "deck of cards"
path = /obj/item/weapon/deck
sort_category = "misc"
cost = 1
/datum/gear/blipstick
display_name = "lipstick, black"
path = /obj/item/weapon/lipstick/black
sort_category = "misc"
cost = 1
/datum/gear/jlipstick
display_name = "lipstick, jade"
path = /obj/item/weapon/lipstick/jade
sort_category = "misc"
cost = 1
/datum/gear/plipstick
display_name = "lipstick, purple"
path = /obj/item/weapon/lipstick/purple
sort_category = "misc"
cost = 1
/datum/gear/rlipstick
display_name = "lipstick, red"
path = /obj/item/weapon/lipstick
sort_category = "misc"
cost = 1
/datum/gear/comb
display_name = "purple comb"
path = /obj/item/weapon/fluff/cado_keppel_1
path = /obj/item/weapon/haircomb
sort_category = "misc"
cost = 2

View File

@@ -1,5 +1,6 @@
/obj/item/clothing
name = "clothing"
siemens_coefficient = 0.9
var/list/species_restricted = null //Only these species can wear this kit.
/*

View File

@@ -234,7 +234,7 @@
icon_state = "chickenhead"
item_state = "chickensuit"
flags = FPRINT | TABLEPASS | BLOCKHAIR
siemens_coefficient = 2.0
siemens_coefficient = 0.7
body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/bearpelt
@@ -243,7 +243,7 @@
icon_state = "bearpelt"
item_state = "bearpelt"
flags = FPRINT | TABLEPASS | BLOCKHAIR
siemens_coefficient = 2.0
siemens_coefficient = 0.7
/obj/item/clothing/head/xenos
name = "xenos helmet"
@@ -261,5 +261,12 @@
icon_state = "philosopher_wig"
item_state = "philosopher_wig"
flags = FPRINT | TABLEPASS | BLOCKHAIR
siemens_coefficient = 2.0
siemens_coefficient = 2.0 //why is it so conductive?!
body_parts_covered = 0
/obj/item/clothing/head/orangebandana //themij: Taryn Kifer
name = "orange bandana"
desc = "An orange piece of cloth, worn on the head."
icon_state = "orange_bandana"
item_state = "orange_bandana"
body_parts_covered = 0

View File

@@ -378,9 +378,9 @@
icon_state = "blueponcho"
item_state = "blueponcho"
/obj/item/clothing/suit/bomber
/obj/item/clothing/suit/storage/bomber
name = "bomber jacker"
desc = "A well-worn WW2 leather bomber jacket."
desc = "A thick, well-worn WW2 leather bomber jacket."
icon_state = "bomber"
item_state = "bomber"
flags = FPRINT | TABLEPASS
@@ -388,3 +388,56 @@
cold_protection = UPPER_TORSO|ARMS
min_cold_protection_temperature = T0C - 20
siemens_coefficient = 0.7
/obj/item/clothing/suit/storage/leather_jacket
name = "leather jacket"
desc = "A black leather coat."
icon_state = "leather_jacket"
item_state = "leather_jacket"
body_parts_covered = UPPER_TORSO|ARMS
/obj/item/clothing/suit/storage/leather_jacket/nanotrasen
desc = "A black leather coat. The letters NT are proudly displayed on the back."
icon_state = "leather_jacket_nt"
//This one has buttons for some reason
/obj/item/clothing/suit/storage/brown_jacket
name = "leather jacket"
desc = "A brown leather coat."
icon_state = "brown_jacket"
item_state = "brown_jacket"
var/open_state = "brown_jacket_open"
body_parts_covered = UPPER_TORSO|ARMS
/obj/item/clothing/suit/storage/brown_jacket/nanotrasen
desc = "A brown leather coat. The letters NT are proudly displayed on the back."
icon_state = "brown_jacket_nt"
open_state = "brown_jacket_nt_open"
/obj/item/clothing/suit/storage/brown_jacket/verb/toggle()
set name = "Toggle Jacket Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
//The inhand sprite (the mob sprite that appears when holding the item in your hand)
//is unchanged, so update only icon_state, not item_state.
if(icon_state == open_state)
usr << "You button up the jacket."
src.icon_state = initial(icon_state)
else if(icon_state == initial(icon_state))
usr << "You unbutton the jacket."
src.icon_state = open_state
update_clothing_icon() //so our overlays update
/obj/item/clothing/suit/hoodie
name = "grey hoodie"
desc = "A warm, grey sweatshirt."
icon_state = "grey_hoodie"
item_state = "grey_hoodie"
min_cold_protection_temperature = T0C - 20
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS

View File

@@ -461,3 +461,11 @@
icon_state = "mechanic_s"
item_state = "mechanic_s"
item_color = "mechanic_s"
/obj/item/clothing/under/cheongsam
name = "White Cheongsam"
desc = "It is a white cheongsam dress."
icon_state = "mai_yang"
item_state = "mai_yang"
item_color = "mai_yang"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS

View File

@@ -301,19 +301,9 @@
icon_on = "engravedzippoon"
icon_off = "engravedzippo"
/obj/item/weapon/fluff/cado_keppel_1 //sparklysheep: Cado Keppel
/obj/item/weapon/haircomb/fluff/cado_keppel_1 //sparklysheep: Cado Keppel
name = "purple comb"
desc = "A pristine purple comb made from flexible plastic. It has a small K etched into its side."
w_class = 1.0
icon = 'icons/obj/custom_items.dmi'
icon_state = "purplecomb"
item_state = "purplecomb"
attack_self(mob/user)
if(user.r_hand == src || user.l_hand == src)
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy"), 1)
return
/obj/item/weapon/fluff/hugo_cinderbacth_1 //thatoneguy: Hugo Cinderbatch
name = "Old Cane"
@@ -756,12 +746,9 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "paintedwelding"
/obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1 //themij: Taryn Kifer
/obj/item/clothing/head/orangebandana/fluff/taryn_kifer_1 //themij: Taryn Kifer
name = "orange bandana"
desc = "Hey, I think we're missing a hazard vest..."
icon = 'icons/obj/custom_items.dmi'
icon_state = "taryn_kifer_1"
body_parts_covered = 0
/obj/item/clothing/head/fluff
body_parts_covered = 0
@@ -1364,14 +1351,9 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "yuri_kornienkovich_flask"
/obj/item/clothing/under/fluff/mai_yang_dress // Mai Yang's pretty pretty dress.
/obj/item/clothing/under/cheongsam/fluff/mai_yang_dress // Mai Yang's pretty pretty dress.
name = "White Cheongsam"
desc = "It is a white cheongsam dress."
icon = 'icons/obj/custom_items.dmi'
icon_state = "mai_yang"
item_state = "mai_yang"
item_color = "mai_yang"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/fluff/sakura_hokkaido_kimono
name = "Sakura Kimono"

View File

@@ -14,7 +14,7 @@
/datum/event/brand_intelligence/start()
for(var/obj/machinery/vending/V in machines)
if(V.z != 1) continue
if(isNotStationLevel(V.z)) continue
vendingMachines.Add(V)
if(!vendingMachines.len)

View File

@@ -17,7 +17,7 @@
var/turf/T = get_turf(H)
if(!T)
continue
if(T.z != 1)
if(isNotStationLevel(T.z))
continue
for(var/datum/disease/D in H.viruses)
foundAlready = 1

View File

@@ -41,7 +41,7 @@
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, D.loc)
sparks.start()
D.z = 2
D.z = config.admin_levels[1]
D.has_loot = 0
del(D)

View File

@@ -250,6 +250,7 @@
language = "Siik'tajr"
tail = "tajtail"
unarmed_type = /datum/unarmed_attack/claws
secondary_unarmed_type = /datum/unarmed_attack/bite/eye_tooth
darksight = 8
cold_level_1 = 200 //Default 260
@@ -378,6 +379,7 @@
deform = 'icons/mob/human_races/r_def_plant.dmi'
language = "Rootspeak"
unarmed_type = /datum/unarmed_attack/diona
secondary_unarmed_type = null //Does a walking mass of dionaea even have jaws, as we understand them?
primitive = /mob/living/carbon/alien/diona
slowdown = 7
rarity_value = 3
@@ -444,6 +446,7 @@
deform = 'icons/mob/human_races/r_machine.dmi'
language = "Tradeband"
unarmed_type = /datum/unarmed_attack/punch
secondary_unarmed_type = null
rarity_value = 2
eyes = "blank_eyes"
@@ -514,6 +517,14 @@
return 0
/datum/unarmed_attack/bite
attack_verb = list("bite") // 'x has biteed y', needs work.
attack_sound = 'sound/weapons/bite.ogg'
shredding = 0
damage = 3
sharp = 0
edge = 0
/datum/unarmed_attack/bite/eye_tooth
attack_verb = list("bite") // 'x has biteed y', needs work.
attack_sound = 'sound/weapons/bite.ogg'
shredding = 0

View File

@@ -862,7 +862,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/update_inv_r_hand(var/update_icons=1)
if(r_hand)
r_hand.screen_loc = ui_rhand //TODO
var/t_state = r_hand.item_state
var/t_state = r_hand.item_state //useful for clothing that changes icon_state but retains the same sprite on the mob when held in hand
if(!t_state) t_state = r_hand.icon_state
if(r_hand.icon_override)
@@ -880,7 +880,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/update_inv_l_hand(var/update_icons=1)
if(l_hand)
l_hand.screen_loc = ui_lhand //TODO
var/t_state = l_hand.item_state
var/t_state = l_hand.item_state //useful for clothing that changes icon_state but retains the same sprite on the mob when held in hand
if(!t_state) t_state = l_hand.icon_state
if(l_hand.icon_override)

View File

@@ -438,3 +438,10 @@ var/list/intents = list("help","disarm","grab","hurt")
var/turf/targetturf = get_turf(M)
if((targetturf.z == sourceturf.z))
M.show_message("<span class='info'>\icon[icon] [message]</span>", 1)
/proc/mobs_in_area(var/area/A)
var/list/mobs = new
for(var/mob/living/M in mob_list)
if(get_area(M) == A)
mobs += M
return mobs

View File

@@ -968,7 +968,7 @@
/*if(!malf.can_shunt)
malf << "<span class='warning'>You cannot shunt.</span>"
return*/
if(src.z != 1)
if(isNotStationLevel(src.z))
return
src.occupier = new /mob/living/silicon/ai(src,malf.laws,null,1)
src.occupier.adjustOxyLoss(malf.getOxyLoss())

View File

@@ -184,7 +184,7 @@ datum
M.resistances += self.data
return
#define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L)
water
name = "Water"
id = "water"
@@ -195,7 +195,18 @@ datum
reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
src = null
//If the turf is hot enough, remove some heat
var/datum/gas_mixture/environment = T.return_air()
var/min_temperature = T0C + 100 //100C, the boiling point of water
if (environment && environment.temperature > min_temperature) //abstracted as steam or something
var/removed_heat = between(0, volume*WATER_LATENT_HEAT, -environment.get_thermal_energy_change(min_temperature))
environment.add_thermal_energy(-removed_heat)
if (prob(5))
T.visible_message("\red The water sizzles as it lands on \the [T]!")
else //otherwise, the turf gets wet
if(volume >= 3)
if(T.wet >= 1) return
T.wet = 1
@@ -205,6 +216,7 @@ datum
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
src = null
spawn(800)
if (!istype(T)) return
if(T.wet >= 2) return
@@ -213,19 +225,14 @@ datum
T.overlays -= T.wet_overlay
T.wet_overlay = null
for(var/mob/living/carbon/slime/M in T)
M.apply_water()
//Put out fires.
var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space))
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles )
lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
lowertemp.react()
T.assume_air(lowertemp)
if(hotspot)
del(hotspot)
return
if(environment)
environment.react() //react at the new temperature
reaction_obj(var/obj/O, var/volume)
src = null
var/turf/T = get_turf(O)
var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space))
@@ -238,7 +245,11 @@ datum
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
return
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if (istype(M, /mob/living/carbon/slime))
var/mob/living/carbon/slime/S = M
S.apply_water()
water/holywater
name = "Holy Water"

View File

@@ -267,6 +267,9 @@ CHARACTER_SLOTS 10
## Defines which Z-levels the station exists on.
STATION_LEVELS 1
## Defines which Z-levels are used for admin functionality, such as Central Command and the Syndicate Shuttle
ADMIN_LEVELS 2
## Defines which Z-levels which, for example, a Code Red announcement may affect
CONTACT_LEVELS 1;5

View File

@@ -35,7 +35,7 @@ Header Section
<table align='center' class="top">
<tr>
<td valign='top'>
<font size='2'><b>Code:</b> Abi79, Aryn, Cael_Aislinn, Ccomp5950, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, JoeyJo0, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, SkyMarshal, Snapshot, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty<br></font>
<font size='2'><b>Code:</b> Abi79, Aryn, Cael_Aislinn, Ccomp5950, Chinsky, cib, CompactNinja, DopeGhoti, Erthilo, Hawk_v3, Head, Ispil, JoeyJo0, Lexusjjss, Melonstorm, Miniature, Mloc, NerdyBoy1104, PsiOmegaDelta, SkyMarshal, Snapshot, Spectre, Strumpetplaya, Sunfall, Tastyfish, Uristqwerty<br></font>
<font size='2'><b>Sprites:</b> Apple_Master, Arcalane, Chinsky, CompactNinja, Deus Dactyl, Erthilo, Flashkirby, JoeyJo0, Miniature, Searif, Xenone, faux<br></font>
<font size='2'><b>Sounds:</b> Aryn<br></font>
<font size='2'><b>Thanks To:</b> /tg/ station, Goonstation, Animus Station, Daedalus, and original Spacestation 13 devs. Skibiliano for the IRC bot.</font>
@@ -56,6 +56,26 @@ should be listed in the changelog upon commit though. Thanks. -->
<!-- DO NOT REMOVE, MOVE, OR COPY THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# -->
<div class='commit sansserif'>
<h2 class='date'>1 november 2014</h2>
<h3 class='author'>PsiOmegaDelta updated:</h3>
<ul class='changes bgimages16'>
<li class='bugfix'>Adds the last missing step to deconstruct fire alarms. Apply wirecutters.</li>
<li class='rscadd'>There's a "new" mining outpost nearby the Research outpost.</li>
<li class='rscadd'>Manifest ghosts now have spookier names.</li>
<li class='rscadd'>Adds a gas monitor computer for the toxin mixing chamber.</li>
<li class='rscadd'>AI can now change the display of individual AI status screens.</li>
<li class='rscadd'>More ion laws..</li>
<li class='rscadd'>All turrets have been replaced with portable variants. Potential targets can be configured on a per turret basis.</li>
<li class='bugfix'>Improved crew monitor map positioning.</li>
<li class='rscadd'>Can now order plastic, body-, and statis bags from cargo</li>
<li class='rscadd'>PDAs now receive newscasts.</li>
<li class='rscadd'>(De)constructable emergency shutters.</li>
<li class='rscadd'>Borgs can now select to simply state their laws or select a radio channel, same as the AI.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>1 October 2014</h2>
<h3 class='author'>RavingManiac updated:</h3>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

BIN
icons/obj/jukebox.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Some files were not shown because too many files have changed in this diff Show More