Merge remote-tracking branch 'upstream/master' into updateicons

This commit is contained in:
tigercat2000
2018-11-08 20:24:48 -08:00
248 changed files with 5410 additions and 2067 deletions
+2 -2
View File
@@ -1540,13 +1540,13 @@
var/helptype = "ADMINHELP"
if(is_mhelp)
helptype = "MENTORHELP"
var/take_msg = "<span class='notice'><b>[helptype]</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> question.</span>"
var/take_msg = "<span class='notice'><b>[helptype]</b>: <b>[key_name_hidden(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> question.</span>"
for(var/client/X in GLOB.admins)
if(check_rights(R_ADMIN, 0, X.mob))
to_chat(X, take_msg)
else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
to_chat(X, take_msg)
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name(usr.client, null, 0)]. Thanks for your patience!</b></span>")
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name_hidden(usr.client, null, 0)]. Thanks for your patience!</b></span>")
else
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
+1 -2
View File
@@ -193,9 +193,8 @@
i.addResponse(src, msg) // Add this response to their open tickets.
return
tickets = SStickets.checkForTicket(C)
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
tickets = SStickets.checkForTicket(C)
tickets = SStickets.checkForTicket(src)
if(tickets)
for(var/datum/admin_ticket/i in tickets)
i.addResponse(src, msg)
-2
View File
@@ -106,7 +106,6 @@ var/global/list/frozen_mob_list = list()
M.can_move = 0
M.overlays += adminomaly
if(M.occupant)
M.removeVerb(/obj/mecha/verb/eject)
to_chat(M.occupant, "<b><font color= red>You have been frozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
message_admins("<span class='notice'>[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]</span>")
log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]")
@@ -117,7 +116,6 @@ var/global/list/frozen_mob_list = list()
M.can_move = 1
M.overlays -= adminomaly
if(M.occupant)
M.addVerb(/obj/mecha/verb/eject)
to_chat(M.occupant, "<b><font color= red>You have been unfrozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
message_admins("<span class='notice'>[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]</span>")
log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
+1 -1
View File
@@ -35,7 +35,7 @@ client/proc/one_click_antag()
if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species))
return FALSE
if(role) // Don't even bother evaluating if there's no role
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && (!jobban_isbanned(M, role)))
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && !M.client.skip_antag && (!jobban_isbanned(M, role)))
return TRUE
else
return FALSE
+2 -2
View File
@@ -646,8 +646,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/atom/A = D
var/coords = istype(A) ? "at ([A.x], [A.y], [A.z])" : ""
if(alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes")
log_admin("[key_name(usr)] deleted [D][coords]")
message_admins("[key_name_admin(usr)] deleted [D][coords]", 1)
log_admin("[key_name(usr)] deleted [D] [coords]")
message_admins("[key_name_admin(usr)] deleted [D] [coords]", 1)
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(isturf(D))
var/turf/T = D
+4 -1
View File
@@ -9,6 +9,9 @@ var/global/datum/prizes/global_prizes = new
prizes += new itempath()
/datum/prizes/proc/PlaceOrder(var/obj/machinery/prize_counter/prize_counter, var/itemID)
if(!prize_counter.Adjacent(usr))
to_chat(usr, "<span class='warning'>You need to be closer!</span>")
return
if(!prize_counter)
return 0
var/datum/prize_item/item = global_prizes.prizes[itemID]
@@ -76,7 +79,7 @@ var/global/datum/prizes/global_prizes = new
/datum/prize_item/cards
name = "Deck of Cards"
desc = "Anyone fancy a game of 52-card Pickup?"
typepath = /obj/item/toy/cards/deck
typepath = /obj/item/deck/cards
cost = 25
/datum/prize_item/crayons
+18 -18
View File
@@ -15,10 +15,10 @@
var/bomb_name = "bomb" // used for naming bombs / mines
var/secured = 1
var/secured = TRUE
var/list/attached_overlays = null
var/obj/item/assembly_holder/holder = null
var/cooldown = 0 //To prevent spam
var/cooldown = FALSE //To prevent spam
var/wires = WIRE_RECEIVE | WIRE_PULSE
var/datum/wires/connected = null // currently only used by timer/signaler
@@ -31,10 +31,10 @@
/obj/item/assembly/proc/activate() //What the device does when turned on
return
/obj/item/assembly/proc/pulsed(radio = 0) //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
/obj/item/assembly/proc/pulsed(radio = FALSE) //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
return
/obj/item/assembly/proc/pulse(radio = 0) //Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
/obj/item/assembly/proc/pulse(radio = FALSE) //Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
return
/obj/item/assembly/proc/toggle_secure() //Code that has to happen when the assembly is un\secured goes here
@@ -58,10 +58,10 @@
/obj/item/assembly/process_cooldown()
cooldown--
if(cooldown <= 0)
return 0
return FALSE
spawn(10)
process_cooldown()
return 1
return TRUE
/obj/item/assembly/Destroy()
if(istype(loc, /obj/item/assembly_holder) || istype(holder))
@@ -73,14 +73,14 @@
holder = null
return ..()
/obj/item/assembly/pulsed(radio = 0)
/obj/item/assembly/pulsed(radio = FALSE)
if(holder && (wires & WIRE_RECEIVE))
activate()
if(radio && (wires & WIRE_RADIO_RECEIVE))
activate()
return 1
return TRUE
/obj/item/assembly/pulse(radio = 0)
/obj/item/assembly/pulse(radio = FALSE)
if(holder && (wires & WIRE_PULSE))
holder.process_activation(src, 1, 0)
if(holder && (wires & WIRE_PULSE_SPECIAL))
@@ -88,15 +88,15 @@
if(istype(loc, /obj/item/grenade)) // This is a hack. Todo: Manage this better -Sayu
var/obj/item/grenade/G = loc
G.prime() // Adios, muchachos
return 1
return TRUE
/obj/item/assembly/activate()
if(!secured || (cooldown > 0))
return 0
if(!secured || cooldown > 0)
return FALSE
cooldown = 2
spawn(10)
process_cooldown()
return 1
return TRUE
/obj/item/assembly/toggle_secure()
secured = !secured
@@ -107,13 +107,13 @@
holder = new /obj/item/assembly_holder(get_turf(src))
if(holder.attach(A, src, user))
to_chat(user, "<span class='notice'>You attach [A] to [src]!</span>")
return 1
return 0
return TRUE
return FALSE
/obj/item/assembly/attackby(obj/item/W, mob/user, params)
if(isassembly(W))
var/obj/item/assembly/A = W
if((!A.secured) && (!secured))
if(!A.secured && !secured)
attach_assembly(A, user)
return
if(isscrewdriver(W))
@@ -129,7 +129,7 @@
/obj/item/assembly/examine(mob/user)
..()
if((in_range(src, user) || loc == user))
if(in_range(src, user) || loc == user)
if(secured)
to_chat(user, "[src] is ready!")
else
@@ -140,7 +140,7 @@
return
user.set_machine(src)
interact(user)
return 1
return TRUE
/obj/item/assembly/interact(mob/user)
return
+21 -19
View File
@@ -24,11 +24,11 @@
overlays += bombassembly.overlays
overlays += "bomb_assembly"
/obj/item/onetankbomb/attackby(obj/item/W as obj, mob/user as mob, params)
/obj/item/onetankbomb/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/analyzer))
bombtank.attackby(W, user, params)
return
if(istype(W, /obj/item/wrench) && !status) //This is basically bomb assembly code inverted. apparently it works.
if(iswrench(W) && !status) //This is basically bomb assembly code inverted. apparently it works.
to_chat(user, "<span class='notice'>You disassemble [src].</span>")
@@ -42,21 +42,23 @@
qdel(src)
return
if((istype(W, /obj/item/weldingtool) && W:welding))
if(!status)
status = 1
investigate_log("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", ATKLOG_FEW)
log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>")
else
status = 0
investigate_log("[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
to_chat(user, "<span class='notice'>The hole has been closed.</span>")
if(iswelder(W))
var/obj/item/weldingtool/WT = W
if(WT.welding)
if(!status)
status = TRUE
investigate_log("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", ATKLOG_FEW)
log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. [bombtank] can now be ignited.</span>")
else
status = FALSE
investigate_log("[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
to_chat(user, "<span class='notice'>The hole has been closed.</span>")
add_fingerprint(user)
..()
/obj/item/onetankbomb/attack_self(mob/user as mob) //pressing the bomb accesses its assembly
/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
bombassembly.attack_self(user, 1)
add_fingerprint(user)
return
@@ -71,23 +73,23 @@
else
bombtank.release()
/obj/item/onetankbomb/HasProximity(atom/movable/AM as mob|obj)
/obj/item/onetankbomb/HasProximity(atom/movable/AM)
if(bombassembly)
bombassembly.HasProximity(AM)
/obj/item/onetankbomb/Crossed(atom/movable/AM as mob|obj) //for mousetraps
/obj/item/onetankbomb/Crossed(atom/movable/AM) //for mousetraps
if(bombassembly)
bombassembly.Crossed(AM)
/obj/item/onetankbomb/on_found(mob/finder as mob) //for mousetraps
/obj/item/onetankbomb/on_found(mob/finder) //for mousetraps
if(bombassembly)
bombassembly.on_found(finder)
/obj/item/onetankbomb/hear_talk(mob/living/M as mob, msg)
/obj/item/onetankbomb/hear_talk(mob/living/M, msg)
if(bombassembly)
bombassembly.hear_talk(M, msg)
/obj/item/onetankbomb/hear_message(mob/living/M as mob, msg)
/obj/item/onetankbomb/hear_message(mob/living/M, msg)
if(bombassembly)
bombassembly.hear_message(M, msg)
+12 -10
View File
@@ -4,31 +4,32 @@
icon_state = "health"
materials = list(MAT_METAL=800, MAT_GLASS=200)
origin_tech = "magnets=1;biotech=1"
secured = 0
secured = FALSE
var/scanning = 0
var/scanning = FALSE
var/health_scan
var/alarm_health = 0
/obj/item/assembly/health/activate()
if(!..()) return 0//Cooldown check
if(!..())
return FALSE//Cooldown check
toggle_scan()
return 0
return FALSE
/obj/item/assembly/health/toggle_secure()
secured = !secured
if(secured && scanning)
processing_objects.Add(src)
else
scanning = 0
scanning = FALSE
processing_objects.Remove(src)
update_icon()
return secured
/obj/item/assembly/health/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/multitool))
/obj/item/assembly/health/attackby(obj/item/W, mob/user)
if(ismultitool(W))
if(alarm_health == 0)
alarm_health = -90
user.show_message("You toggle [src] to \"detect death\" mode.")
@@ -61,7 +62,8 @@
return
/obj/item/assembly/health/proc/toggle_scan()
if(!secured) return 0
if(!secured)
return FALSE
scanning = !scanning
if(scanning)
processing_objects.Add(src)
@@ -69,10 +71,10 @@
processing_objects.Remove(src)
return
/obj/item/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
/obj/item/assembly/health/interact(mob/user)//TODO: Change this to the wires thingy
if(!secured)
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
return 0
return FALSE
var/dat = text("<TT><B>Health Sensor</B> <A href='?src=[UID()];scanning=1'>[scanning?"On":"Off"]</A>")
if(scanning && health_scan)
dat += "<BR>Health: [health_scan]"
+171 -172
View File
@@ -9,204 +9,203 @@
throw_speed = 3
throw_range = 10
var/secured = 0
var/secured = FALSE
var/obj/item/assembly/a_left = null
var/obj/item/assembly/a_right = null
proc/attach(var/obj/item/D, var/obj/item/D2, var/mob/user)
return
/obj/item/assembly_holder/proc/attach(obj/item/D, obj/item/D2, mob/user)
return
proc/process_activation(var/obj/item/D)
return
/obj/item/assembly_holder/proc/process_activation(var/obj/item/D)
return
/obj/item/assembly_holder/IsAssemblyHolder()
return TRUE
/obj/item/assembly_holder/Destroy()
if(a_left)
a_left.holder = null
if(a_right)
a_right.holder = null
return ..()
IsAssemblyHolder()
return 1
Destroy()
if(a_left)
a_left.holder = null
if(a_right)
a_right.holder = null
return ..()
attach(var/obj/item/D, var/obj/item/D2, var/mob/user)
if((!D)||(!D2)) return 0
if((!isassembly(D))||(!isassembly(D2))) return 0
if((D:secured)||(D2:secured)) return 0
if(!D.remove_item_from_storage(src))
if(user)
user.remove_from_mob(D)
D.loc = src
if(!D2.remove_item_from_storage(src))
if(user)
user.remove_from_mob(D2)
D2.loc = src
D:holder = src
D2:holder = src
a_left = D
a_right = D2
name = "[D.name]-[D2.name] assembly"
update_icon()
return 1
/obj/item/assembly_holder/attach(obj/item/D, obj/item/D2, mob/user)
if(!D || !D2)
return FALSE
if(!isassembly(D) || !isassembly(D2))
return FALSE
var/obj/item/assembly/A1 = D
var/obj/item/assembly/A2 = D2
if(A1.secured || A2.secured)
return FALSE
if(!A1.remove_item_from_storage(src))
if(user)
user.remove_from_mob(A1)
A1.loc = src
if(!A2.remove_item_from_storage(src))
if(user)
user.remove_from_mob(A2)
A2.loc = src
A1.holder = src
A2.holder = src
a_left = A1
a_right = A2
name = "[A1.name]-[A2.name] assembly"
update_icon()
overlays.Cut()
if(a_left)
overlays += "[a_left.icon_state]_left"
for(var/O in a_left.attached_overlays)
overlays += "[O]_l"
if(a_right)
src.overlays += "[a_right.icon_state]_right"
for(var/O in a_right.attached_overlays)
overlays += "[O]_r"
if(master)
master.update_icon()
return TRUE
examine(mob/user)
..(user)
if((in_range(src, user) || src.loc == user))
if(src.secured)
to_chat(user, "\The [src] is ready!")
else
to_chat(user, "\The [src] can be attached!")
/obj/item/assembly_holder/update_icon()
overlays.Cut()
if(a_left)
overlays += "[a_left.icon_state]_left"
for(var/O in a_left.attached_overlays)
overlays += "[O]_l"
if(a_right)
overlays += "[a_right.icon_state]_right"
for(var/O in a_right.attached_overlays)
overlays += "[O]_r"
if(master)
master.update_icon()
HasProximity(atom/movable/AM as mob|obj)
if(a_left)
a_left.HasProximity(AM)
if(a_right)
a_right.HasProximity(AM)
/obj/item/assembly_holder/examine(mob/user)
..(user)
if(in_range(src, user) || loc == user)
if(secured)
to_chat(user, "[src] is ready!")
else
to_chat(user, "[src] can be attached!")
Crossed(atom/movable/AM as mob|obj)
if(a_left)
a_left.Crossed(AM)
if(a_right)
a_right.Crossed(AM)
on_found(mob/finder as mob)
if(a_left)
a_left.on_found(finder)
if(a_right)
a_right.on_found(finder)
/obj/item/assembly_holder/HasProximity(atom/movable/AM)
if(a_left)
a_left.HasProximity(AM)
if(a_right)
a_right.HasProximity(AM)
hear_talk(mob/living/M as mob, msg)
if(a_left)
a_left.hear_talk(M, msg)
if(a_right)
a_right.hear_talk(M, msg)
/obj/item/assembly_holder/Crossed(atom/movable/AM)
if(a_left)
a_left.Crossed(AM)
if(a_right)
a_right.Crossed(AM)
hear_message(mob/living/M as mob, msg)
if(a_left)
a_left.hear_message(M, msg)
if(a_right)
a_right.hear_message(M, msg)
/obj/item/assembly_holder/on_found(mob/finder)
if(a_left)
a_left.on_found(finder)
if(a_right)
a_right.on_found(finder)
proc/process_movement() // infrared beams and prox sensors
if(a_left && a_right)
a_left.holder_movement()
a_right.holder_movement()
Move()
..()
process_movement()
/obj/item/assembly_holder/hear_talk(mob/living/M, msg)
if(a_left)
a_left.hear_talk(M, msg)
if(a_right)
a_right.hear_talk(M, msg)
/obj/item/assembly_holder/hear_message(mob/living/M, msg)
if(a_left)
a_left.hear_message(M, msg)
if(a_right)
a_right.hear_message(M, msg)
/obj/item/assembly_holder/proc/process_movement() // infrared beams and prox sensors
if(a_left && a_right)
a_left.holder_movement()
a_right.holder_movement()
/obj/item/assembly_holder/Move()
..()
process_movement()
return
/obj/item/assembly_holder/pickup()
..()
process_movement()
/obj/item/assembly_holder/Bump()
..()
process_movement()
/obj/item/assembly_holder/throw_impact() // called when a throw stops
..()
process_movement()
/obj/item/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
if(a_left && a_right)
a_left.holder_movement()
a_right.holder_movement()
..()
return
/obj/item/assembly_holder/attackby(obj/item/W, mob/user, params)
if(isscrewdriver(W))
if(!a_left || !a_right)
to_chat(user, "<span class='warning'>BUG:Assembly part missing, please report this!</span>")
return
a_left.toggle_secure()
a_right.toggle_secure()
secured = !secured
if(secured)
to_chat(user, "<span class='notice'>[src] is ready!</span>")
else
to_chat(user, "<span class='notice'>[src] can now be taken apart!</span>")
update_icon()
return
pickup()
else
..()
process_movement()
Bump()
..()
process_movement()
throw_impact() // called when a throw stops
..()
process_movement()
attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
if(a_left && a_right)
a_left.holder_movement()
a_right.holder_movement()
..()
return
return
attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/screwdriver))
if(!a_left || !a_right)
to_chat(user, "<span class='warning'>BUG:Assembly part missing, please report this!</span>")
return
a_left.toggle_secure()
a_right.toggle_secure()
secured = !secured
if(secured)
to_chat(user, "<span class='notice'>\The [src] is ready!</span>")
else
to_chat(user, "<span class='notice'>\The [src] can now be taken apart!</span>")
update_icon()
/obj/item/assembly_holder/attack_self(mob/user)
add_fingerprint(user)
if(secured)
if(!a_left || !a_right)
to_chat(user, "<span class='warning'>Assembly part missing!</span>")
return
if(istype(a_left, a_right.type))//If they are the same type it causes issues due to window code
switch(alert("Which side would you like to use?",,"Left","Right"))
if("Left")
a_left.attack_self(user)
if("Right")
a_right.attack_self(user)
return
else
..()
return
a_left.attack_self(user)
a_right.attack_self(user)
else
var/turf/T = get_turf(src)
if(!T)
return FALSE
if(a_left)
a_left.holder = null
a_left.loc = T
if(a_right)
a_right.holder = null
a_right.loc = T
qdel(src)
attack_self(mob/user as mob)
src.add_fingerprint(user)
if(src.secured)
if(!a_left || !a_right)
to_chat(user, "<span class='warning'>Assembly part missing!</span>")
return
if(istype(a_left,a_right.type))//If they are the same type it causes issues due to window code
switch(alert("Which side would you like to use?",,"Left","Right"))
if("Left") a_left.attack_self(user)
if("Right") a_right.attack_self(user)
return
else
a_left.attack_self(user)
a_right.attack_self(user)
else
var/turf/T = get_turf(src)
if(!T) return 0
if(a_left)
a_left:holder = null
a_left.loc = T
if(a_right)
a_right:holder = null
a_right.loc = T
spawn(0)
/obj/item/assembly_holder/process_activation(obj/D, normal = TRUE, special = TRUE)
if(!D)
return FALSE
if(normal && a_right && a_left)
if(a_right != D)
a_right.pulsed(0)
if(a_left != D)
a_left.pulsed(0)
if(master)
master.receive_signal()
return TRUE
/obj/item/assembly_holder/ex_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
if(prob(50))
qdel(src)
return
process_activation(var/obj/D, var/normal = 1, var/special = 1)
if(!D) return 0
if((normal) && (a_right) && (a_left))
if(a_right != D)
a_right.pulsed(0)
if(a_left != D)
a_left.pulsed(0)
if(master)
master.receive_signal()
return 1
ex_act(severity)
switch(severity)
if(1.0)
if(3)
if(prob(25))
qdel(src)
return
if(2.0)
if(prob(50))
qdel(src)
return
if(3.0)
if(prob(25))
qdel(src)
return
return
+12 -11
View File
@@ -17,28 +17,29 @@
/obj/item/assembly/igniter/describe()
return "The igniter is [secured?"secured.":"unsecured."]"
return "The igniter is [secured ? "secured." : "unsecured."]"
/obj/item/assembly/igniter/activate()
if(!..()) return 0//Cooldown check
if(!..())
return FALSE//Cooldown check
var/turf/location = get_turf(loc)
if(location) location.hotspot_expose(1000,1000)
if(istype(src.loc,/obj/item/assembly_holder))
if(istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
if(location)
location.hotspot_expose(1000,1000)
if(istype(loc, /obj/item/assembly_holder))
if(istype(loc.loc, /obj/structure/reagent_dispensers/fueltank))
var/obj/structure/reagent_dispensers/fueltank/tank = loc.loc
if(tank)
tank.boom(TRUE)
if(istype(src.loc.loc, /obj/item/reagent_containers/glass/beaker/))
var/obj/item/reagent_containers/glass/beaker/beakerbomb = src.loc.loc
if(istype(loc.loc, /obj/item/reagent_containers/glass/beaker))
var/obj/item/reagent_containers/glass/beaker/beakerbomb = loc.loc
if(beakerbomb)
beakerbomb.heat_beaker()
sparks.start()
return 1
return TRUE
/obj/item/assembly/igniter/attack_self(mob/user as mob)
/obj/item/assembly/igniter/attack_self(mob/user)
activate()
add_fingerprint(user)
return
+20 -18
View File
@@ -7,10 +7,10 @@
bomb_name = "tripwire mine"
secured = 0 // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise
secured = FALSE // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise
dir = EAST
var/on = 0
var/visible = 1
var/on = FALSE
var/visible = TRUE
var/obj/effect/beam/i_beam/first = null
var/obj/effect/beam/i_beam/last = null
var/max_nesting_level = 10
@@ -33,17 +33,18 @@
to_chat(user, describe())
/obj/item/assembly/infra/activate()
if(!..()) return 0//Cooldown check
if(!..())
return FALSE//Cooldown check
on = !on
update_icon()
return 1
return TRUE
/obj/item/assembly/infra/toggle_secure()
secured = !secured
if(secured)
processing_objects.Add(src)
else
on = 0
on = FALSE
if(first)
qdel(first)
processing_objects.Remove(src)
@@ -94,7 +95,7 @@
first = I
step(I, I.dir)
if(first)
I.density = 0
I.density = FALSE
I.vis_spread(visible)
I.limit = 8
I.process()
@@ -110,9 +111,10 @@
qdel(first)
/obj/item/assembly/infra/holder_movement()
if(!holder) return 0
if(!holder)
return FALSE
qdel(first)
return 1
return TRUE
/obj/item/assembly/infra/equipped(var/mob/user, var/slot)
qdel(first)
@@ -124,7 +126,7 @@
/obj/item/assembly/infra/proc/trigger_beam()
if(!secured || !on || cooldown > 0)
return 0
return FALSE
pulse(0)
audible_message("[bicon(src)] *beep* *beep*", null, 3)
if(first)
@@ -133,7 +135,7 @@
spawn(10)
process_cooldown()
/obj/item/assembly/infra/interact(mob/user as mob)//TODO: change this this to the wire control panel
/obj/item/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel
if(!secured) return
user.set_machine(src)
var/dat = {"<TT><B>Infrared Laser</B>
@@ -196,7 +198,7 @@
arm()
/obj/item/assembly/infra/armed/stealth
visible = 0
visible = FALSE
/***************************IBeam*********************************/
@@ -209,11 +211,11 @@
var/obj/effect/beam/i_beam/previous = null
var/obj/item/assembly/infra/master = null
var/limit = null
var/visible = 0.0
var/visible = FALSE
var/left = null
var/life_cycles = 0
var/life_cap = 20
anchored = 1.0
anchored = TRUE
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -241,9 +243,9 @@
if(!(visible))
invisibility = 101
else
invisibility = 0
invisibility = FALSE
else
invisibility = 0
invisibility = FALSE
if(!next && (limit > 0))
var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(loc)
@@ -255,7 +257,7 @@
next = I
step(I, I.dir)
if(next)
I.density = 0
I.density = FALSE
I.vis_spread(visible)
I.limit = limit - 1
master.last = I
@@ -267,7 +269,7 @@
/obj/effect/beam/i_beam/Bumped()
hit()
/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj)
/obj/effect/beam/i_beam/Crossed(atom/movable/AM)
if(!isobj(AM) && !isliving(AM))
return
if(istype(AM, /obj/effect))
+109 -115
View File
@@ -4,128 +4,122 @@
icon_state = "mousetrap"
materials = list(MAT_METAL=100)
origin_tech = "combat=1;materials=2;engineering=1"
var/armed = 0
var/armed = FALSE
bomb_name = "contact mine"
examine(mob/user)
..(user)
if(armed)
to_chat(user, "It looks like it's armed.")
/obj/item/assembly/mousetrap/examine(mob/user)
..(user)
if(armed)
to_chat(user, "It looks like it's armed.")
activate()
if(..())
armed = !armed
if(!armed)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
to_chat(user, "Your hand slips, setting off the trigger.")
pulse(0)
update_icon()
if(usr)
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
describe()
return "The pressure switch is [armed?"primed":"safe"]."
update_icon()
if(armed)
icon_state = "mousetraparmed"
else
icon_state = "mousetrap"
if(holder)
holder.update_icon()
proc/triggered(mob/target as mob, var/type = "feet")
if(!armed)
return
var/obj/item/organ/external/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
switch(type)
if("feet")
if(!H.shoes)
affecting = H.get_organ(pick("l_leg", "r_leg"))
H.Weaken(3)
if("l_hand", "r_hand")
if(!H.gloves)
affecting = H.get_organ(type)
H.Stun(3)
if(affecting)
affecting.receive_damage(1, 0)
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
visible_message("<span class='danger'>SPLAT!</span>")
M.splat()
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
layer = MOB_LAYER - 0.2
armed = 0
update_icon()
pulse(0)
attack_self(mob/living/user as mob)
if(!armed)
to_chat(user, "<span class='notice'>You arm [src].</span>")
else
if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
to_chat(user, "<span class='notice'>You disarm [src].</span>")
/obj/item/assembly/mousetrap/activate()
if(..())
armed = !armed
update_icon()
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
attack_hand(mob/living/user as mob)
if(armed)
if(((user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
..()
Crossed(var/atom/movable/AM as mob|obj)
if(armed)
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.m_intent == MOVE_INTENT_RUN)
triggered(H)
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
"<span class='warning'>You accidentally step on [src]</span>")
else if(ismouse(AM))
triggered(AM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
triggered(AM)
..()
on_found(mob/finder as mob)
if(armed)
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking [finder.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
triggered(finder, finder.hand ? "l_hand" : "r_hand")
return 1 //end the search!
return 0
hitby(A as mob|obj)
if(!armed)
return ..()
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
triggered(null)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
to_chat(user, "Your hand slips, setting off the trigger.")
pulse(0)
update_icon()
if(usr)
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
/obj/item/assembly/mousetrap/describe()
return "The pressure switch is [armed ? "primed" : "safe"]."
/obj/item/assembly/mousetrap/update_icon()
if(armed)
icon_state = "mousetraparmed"
else
icon_state = "mousetrap"
if(holder)
holder.update_icon()
/obj/item/assembly/mousetrap/proc/triggered(mob/target, var/type = "feet")
if(!armed)
return
var/obj/item/organ/external/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
switch(type)
if("feet")
if(!H.shoes)
affecting = H.get_organ(pick("l_leg", "r_leg"))
H.Weaken(3)
if("l_hand", "r_hand")
if(!H.gloves)
affecting = H.get_organ(type)
H.Stun(3)
if(affecting)
affecting.receive_damage(1, 0)
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
visible_message("<span class='danger'>SPLAT!</span>")
M.splat()
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
layer = MOB_LAYER - 0.2
armed = FALSE
update_icon()
pulse(0)
/obj/item/assembly/mousetrap/attack_self(mob/living/user)
if(!armed)
to_chat(user, "<span class='notice'>You arm [src].</span>")
else
if((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
to_chat(user, "<span class='notice'>You disarm [src].</span>")
armed = !armed
update_icon()
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
/obj/item/assembly/mousetrap/attack_hand(mob/living/user)
if(armed)
if((user.getBrainLoss() >= 60 || CLUMSY in user.mutations) && prob(50))
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
return
..()
/obj/item/assembly/mousetrap/Crossed(atom/movable/AM)
if(armed)
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.m_intent == MOVE_INTENT_RUN)
triggered(H)
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
"<span class='warning'>You accidentally step on [src]</span>")
else if(ismouse(AM))
triggered(AM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
triggered(AM)
..()
/obj/item/assembly/mousetrap/on_found(mob/finder)
if(armed)
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking [finder.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
triggered(finder, finder.hand ? "l_hand" : "r_hand")
return TRUE //end the search!
return FALSE
/obj/item/assembly/mousetrap/hitby(atom/movable/A)
if(!armed)
return ..()
visible_message("<span class='warning'>[src] is triggered by [A].</span>")
triggered(null)
/obj/item/assembly/mousetrap/armed
icon_state = "mousetraparmed"
+8 -8
View File
@@ -19,11 +19,11 @@
return "The proximity sensor is [scanning ? "armed" : "disarmed"]."
/obj/item/assembly/prox_sensor/activate()
if(!..())
return 0 //Cooldown check
if(!..())
return FALSE //Cooldown check
timing = !timing
update_icon()
return 0
return FALSE
/obj/item/assembly/prox_sensor/toggle_secure()
secured = !secured
@@ -39,14 +39,14 @@
/obj/item/assembly/prox_sensor/HasProximity(atom/movable/AM)
if(!isobj(AM) && !isliving(AM))
return
if(istype(AM, /obj/effect))
if(istype(AM, /obj/effect))
return
if(AM.move_speed < 12)
sense()
/obj/item/assembly/prox_sensor/proc/sense()
if((!secured)||(!scanning)||(cooldown > 0))
return 0
if(!secured || !scanning || cooldown > 0)
return FALSE
pulse(0)
visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
cooldown = 2
@@ -69,7 +69,7 @@
/obj/item/assembly/prox_sensor/proc/toggle_scan()
if(!secured)
return 0
return FALSE
scanning = !scanning
update_icon()
@@ -95,7 +95,7 @@
/obj/item/assembly/prox_sensor/interact(mob/user)//TODO: Change this to the wires thingy
if(!secured)
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
return 0
return FALSE
var/second = time % 60
var/minute = (time - second) / 60
var/dat = text("<TT><B>Proximity Sensor</B>\n[] []:[]\n<A href='?src=[UID()];tp=-30'>-</A> <A href='?src=[UID()];tp=-1'>-</A> <A href='?src=[UID()];tp=1'>+</A> <A href='?src=[UID()];tp=30'>+</A>\n</TT>", (timing ? "<A href='?src=[UID()];time=0'>Arming</A>" : "<A href='?src=[UID()];time=1'>Not Arming</A>"), minute, second)
+23 -32
View File
@@ -8,7 +8,7 @@
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
secured = 1
var/receiving = 0
var/receiving = FALSE
bomb_name = "remote-control bomb"
@@ -35,28 +35,25 @@
return ..()
/obj/item/assembly/signaler/describe()
return "\The [src]'s power light is [receiving?"on":"off"]"
return "[src]'s power light is [receiving ? "on" : "off"]"
/obj/item/assembly/signaler/activate()
if(cooldown > 0) return 0
if(cooldown > 0)
return FALSE
cooldown = 2
spawn(10)
process_cooldown()
signal()
return 1
return TRUE
/obj/item/assembly/signaler/update_icon()
if(holder)
holder.update_icon()
return
/obj/item/assembly/signaler/interact(mob/user as mob, flag1)
/obj/item/assembly/signaler/interact(mob/user, flag1)
var/t1 = "-------"
// if((src.b_stat && !( flag1 )))
// t1 = text("-------<BR>\nGreen Wire: []<BR>\nRed Wire: []<BR>\nBlue Wire: []<BR>\n", (src.wires & 4 ? "<A href='?src=[UID()];wires=4'>Cut Wire</A>" : "<A href='?src=[UID()];wires=4'>Mend Wire</A>"), (src.wires & 2 ? "<A href='?src=[UID()];wires=2'>Cut Wire</A>" : "<A href='?src=[UID()];wires=2'>Mend Wire</A>"), (src.wires & 1 ? "<A href='?src=[UID()];wires=1'>Cut Wire</A>" : "<A href='?src=[UID()];wires=1'>Mend Wire</A>"))
// else
// t1 = "-------" Speaker: [src.listening ? "<A href='byond://?src=[UID()];listen=0'>Engaged</A>" : "<A href='byond://?src=[UID()];listen=1'>Disengaged</A>"]<BR>
var/dat = {"
<TT>
"}
@@ -70,14 +67,14 @@
Frequency:
<A href='byond://?src=[UID()];freq=-10'>-</A>
<A href='byond://?src=[UID()];freq=-2'>-</A>
[format_frequency(src.frequency)]
[format_frequency(frequency)]
<A href='byond://?src=[UID()];freq=2'>+</A>
<A href='byond://?src=[UID()];freq=10'>+</A><BR>
Code:
<A href='byond://?src=[UID()];code=-5'>-</A>
<A href='byond://?src=[UID()];code=-1'>-</A>
[src.code]
[code]
<A href='byond://?src=[UID()];code=1'>+</A>
<A href='byond://?src=[UID()];code=5'>+</A><BR>
[t1]
@@ -87,8 +84,6 @@
popup.set_content(dat)
popup.open(0)
onclose(user, "radio")
return
/obj/item/assembly/signaler/Topic(href, href_list)
..()
@@ -105,10 +100,10 @@
set_frequency(new_frequency)
if(href_list["code"])
src.code += text2num(href_list["code"])
src.code = round(src.code)
src.code = min(100, src.code)
src.code = max(1, src.code)
code += text2num(href_list["code"])
code = round(code)
code = min(100, code)
code = max(1, code)
if(href_list["receive"])
receiving = !receiving
@@ -119,10 +114,9 @@
if(usr)
attack_self(usr)
return
/obj/item/assembly/signaler/proc/signal()
if(!radio_connection) return
if(!radio_connection)
return
var/datum/signal/signal = new
signal.source = src
@@ -135,27 +129,25 @@
if(usr)
lastsignalers.Add("[time] <B>:</B> [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) <B>:</B> [format_frequency(frequency)]/[code]")
return
/obj/item/assembly/signaler/pulse(var/radio = 0)
if(src.connected && src.wires)
/obj/item/assembly/signaler/pulse(var/radio = FALSE)
if(connected && wires)
connected.Pulse(src)
else
return ..(radio)
/obj/item/assembly/signaler/receive_signal(datum/signal/signal)
if( !receiving || !signal )
return 0
if(!receiving || !signal)
return FALSE
if(signal.encryption != code)
return 0
return FALSE
if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0
if(!(wires & WIRE_RADIO_RECEIVE))
return FALSE
pulse(1)
for(var/mob/O in hearers(1, src.loc))
for(var/mob/O in hearers(1, loc))
O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
return
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
if(!radio_controller)
@@ -165,7 +157,6 @@
radio_controller.remove_object(src, frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
return
// Embedded signaller used in anomalies.
/obj/item/assembly/signaler/anomaly
@@ -173,7 +164,7 @@
desc = "The neutralized core of an anomaly. It'd probably be valuable for research."
icon_state = "anomaly core"
item_state = "electronic"
receiving = 1
receiving = TRUE
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
..()
+105 -118
View File
@@ -5,136 +5,123 @@
materials = list(MAT_METAL=500, MAT_GLASS=50)
origin_tech = "magnets=1;engineering=1"
secured = 0
secured = FALSE
bomb_name = "time bomb"
var/timing = 0
var/timing = FALSE
var/time = 10
var/repeat = 0
var/repeat = FALSE
var/set_time = 10
proc
timer_end()
describe()
if(timing)
return "The timer is counting down from [time]!"
return "The timer is set for [time] seconds."
activate()
if(!..()) return 0//Cooldown check
timing = !timing
update_icon()
return 0
toggle_secure()
secured = !secured
if(secured)
processing_objects.Add(src)
else
timing = 0
processing_objects.Remove(src)
update_icon()
return secured
timer_end()
if((!secured)||(cooldown > 0)) return 0
pulse(0)
if(loc)
loc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
return
process()
if(timing && (time > 0))
time -= 2 // 2 seconds per process()
if(timing && time <= 0)
timing = repeat
timer_end()
time = set_time
return
/obj/item/assembly/timer/describe()
if(timing)
return "The timer is counting down from [time]!"
return "The timer is set for [time] seconds."
/obj/item/assembly/timer/activate()
if(!..())
return FALSE//Cooldown check
timing = !timing
update_icon()
overlays.Cut()
attached_overlays = list()
if(timing)
overlays += "timer_timing"
attached_overlays += "timer_timing"
if(holder)
holder.update_icon()
return FALSE
/obj/item/assembly/timer/toggle_secure()
secured = !secured
if(secured)
processing_objects.Add(src)
else
timing = FALSE
processing_objects.Remove(src)
update_icon()
return secured
/obj/item/assembly/timer/proc/timer_end()
if(!secured || cooldown > 0)
return FALSE
pulse(0)
if(loc)
loc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
/obj/item/assembly/timer/process()
if(timing && (time > 0))
time -= 2 // 2 seconds per process()
if(timing && time <= 0)
timing = repeat
timer_end()
time = set_time
/obj/item/assembly/timer/update_icon()
overlays.Cut()
attached_overlays = list()
if(timing)
overlays += "timer_timing"
attached_overlays += "timer_timing"
if(holder)
holder.update_icon()
/obj/item/assembly/timer/interact(mob/user as mob)//TODO: Have this use the wires
if(!secured)
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
return FALSE
var/second = time % 60
var/minute = (time - second) / 60
var/set_second = set_time % 60
var/set_minute = (set_time - set_second) / 60
if(second < 10) second = "0[second]"
if(set_second < 10) set_second = "0[set_second]"
var/dat = {"
<TT>
<center><h2>Timing Unit</h2>
[minute]:[second] <a href='?src=[UID()];time=1'>[timing?"Stop":"Start"]</a> <a href='?src=[UID()];reset=1'>Reset</a><br>
Repeat: <a href='?src=[UID()];repeat=1'>[repeat?"On":"Off"]</a><br>
Timer set for
<A href='?src=[UID()];tp=-30'>-</A> <A href='?src=[UID()];tp=-1'>-</A> [set_minute]:[set_second] <A href='?src=[UID()];tp=1'>+</A> <A href='?src=[UID()];tp=30'>+</A>
</center>
</TT>
<BR><BR>
<A href='?src=[UID()];refresh=1'>Refresh</A>
<BR><BR>
<A href='?src=[UID()];close=1'>Close</A>"}
var/datum/browser/popup = new(user, "timer", name, 400, 400)
popup.set_content(dat)
popup.open(0)
onclose(user, "timer")
/obj/item/assembly/timer/Topic(href, href_list)
..()
if(usr.incapacitated() || !in_range(loc, usr))
usr << browse(null, "window=timer")
onclose(usr, "timer")
return
if(href_list["time"])
timing = !timing
if(timing && istype(holder, /obj/item/transfer_valve))
message_admins("[key_name_admin(usr)] activated [src] attachment on [holder].")
investigate_log("[key_name(usr)] activated [src] attachment for [loc]", INVESTIGATE_BOMB)
log_game("[key_name(usr)] activated [src] attachment for [loc]")
update_icon()
if(href_list["reset"])
time = set_time
interact(mob/user as mob)//TODO: Have this use the wires
if(!secured)
user.show_message("<span class='warning'>The [name] is unsecured!</span>")
return 0
var/second = time % 60
var/minute = (time - second) / 60
var/set_second = set_time % 60
var/set_minute = (set_time - set_second) / 60
if(second < 10) second = "0[second]"
if(set_second < 10) set_second = "0[set_second]"
if(href_list["repeat"])
repeat = !repeat
var/dat = {"
<TT>
<center><h2>Timing Unit</h2>
[minute]:[second] <a href='?src=[UID()];time=1'>[timing?"Stop":"Start"]</a> <a href='?src=[UID()];reset=1'>Reset</a><br>
Repeat: <a href='?src=[UID()];repeat=1'>[repeat?"On":"Off"]</a><br>
Timer set for
<A href='?src=[UID()];tp=-30'>-</A> <A href='?src=[UID()];tp=-1'>-</A> [set_minute]:[set_second] <A href='?src=[UID()];tp=1'>+</A> <A href='?src=[UID()];tp=30'>+</A>
</center>
</TT>
<BR><BR>
<A href='?src=[UID()];refresh=1'>Refresh</A>
<BR><BR>
<A href='?src=[UID()];close=1'>Close</A>"}
var/datum/browser/popup = new(user, "timer", name, 400, 400)
popup.set_content(dat)
popup.open(0)
onclose(user, "timer")
return
Topic(href, href_list)
..()
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
usr << browse(null, "window=timer")
onclose(usr, "timer")
return
if(href_list["time"])
timing = !timing
if(timing && istype(holder, /obj/item/transfer_valve))
message_admins("[key_name_admin(usr)] activated [src] attachment on [holder].")
investigate_log("[key_name(usr)] activated [src] attachment for [loc]", INVESTIGATE_BOMB)
log_game("[key_name(usr)] activated [src] attachment for [loc]")
update_icon()
if(href_list["reset"])
if(href_list["tp"])
var/tp = text2num(href_list["tp"])
set_time += tp
set_time = min(max(round(set_time), 6), 600)
if(!timing)
time = set_time
if(href_list["repeat"])
repeat = !repeat
if(href_list["tp"])
var/tp = text2num(href_list["tp"])
set_time += tp
set_time = min(max(round(set_time), 6), 600)
if(!timing)
time = set_time
if(href_list["close"])
usr << browse(null, "window=timer")
return
if(usr)
attack_self(usr)
if(href_list["close"])
usr << browse(null, "window=timer")
return
if(usr)
attack_self(usr)
+3 -2
View File
@@ -41,12 +41,13 @@
/obj/item/assembly/voice/attack_self(mob/user)
if(!user || !secured) return 0
if(!user || !secured)
return FALSE
listening = !listening
var/turf/T = get_turf(src)
T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
return 1
return TRUE
/obj/item/assembly/voice/toggle_secure()
+10 -7
View File
@@ -6,6 +6,8 @@
/obj/effect/mob_spawn
name = "Unknown"
density = TRUE
anchored = TRUE
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
var/mob_type = null
@@ -26,13 +28,12 @@
var/datum/disease/disease = null //Do they start with a pre-spawned disease?
var/mob_color //Change the mob's color
var/assignedrole
density = TRUE
anchored = TRUE
var/banType = "lavaland"
var/ghost_usable = TRUE
/obj/effect/mob_spawn/attack_ghost(mob/user)
if(ticker.current_state != GAME_STATE_PLAYING || !loc)
if(ticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable)
return
if(!uses)
to_chat(user, "<span class='warning'>This spawner is out of charges!</span>")
@@ -40,6 +41,8 @@
if(jobban_isbanned(user, banType))
to_chat(user, "<span class='warning'>You are jobanned!</span>")
return
if(QDELETED(src) || QDELETED(user))
return
var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
if(ghost_role == "No" || !loc)
return
@@ -50,7 +53,7 @@
. = ..()
if(instant || roundstart) //at some point we should probably re-introduce the (ticker && ticker.current_state > GAME_STATE_SETTING_UP) portion of this check, but for now it was preventing the corpses from spawning at roundstart and resulting in ghost role spawners that made dead bodies.
create()
else
else if(ghost_usable)
GLOB.poi_list |= src
LAZYADD(GLOB.mob_spawners[name], src)
@@ -305,7 +308,7 @@
name = "sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
flavour_text = "You are a space doctor!"
flavour_text = "<span class='big bold'>You are a space doctor!</span>"
assignedrole = "Space Doctor"
/obj/effect/mob_spawn/human/doctor/alive/equip(mob/living/carbon/human/H)
@@ -436,7 +439,7 @@
name = "bartender sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
flavour_text = "You are a space bartender!"
flavour_text = "<span class='big bold'>You are a space bartender!</span><b> Time to mix drinks and change lives.</b>"
assignedrole = "Space Bartender"
/datum/outfit/spacebartender
@@ -556,4 +559,4 @@
back = /obj/item/storage/backpack
shoes = /obj/item/clothing/shoes/black
suit = /obj/item/clothing/suit/armor/vest
glasses = /obj/item/clothing/glasses/sunglasses/reagent
glasses = /obj/item/clothing/glasses/sunglasses/reagent
@@ -0,0 +1,475 @@
// items
/obj/item/storage/firstaid/ancient
icon_state = "firstaid"
desc = "A first aid kit with the ability to heal common types of injuries."
/obj/item/storage/firstaid/ancient/New()
..()
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
/obj/item/card/id/away/old
name = "A perfectly retrograde identification card"
desc = "A perfectly retrograde identification card. Looks like it could use some flavor."
icon = 'icons/obj/card.dmi'
icon_state = "retro"
access = list(access_away01)
/obj/item/card/id/away/old/sec
name = "Security Officer ID"
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Security Dept."
icon_state = "retro_security"
/obj/item/card/id/away/old/sci
name = "Scientist ID"
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Science Dept."
icon_state = "retro_research"
/obj/item/card/id/away/old/med
name = "Medical ID"
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Medical Dept."
icon_state = "retro_medical"
/obj/item/card/id/away/old/eng
name = "Engineer ID"
desc = "A clip on ID Badge, has one of those fancy new magnetic strips built in. This one is encoded for the Engineering Dept."
icon_state = "retro_engineering"
/obj/item/card/id/away/old/apc
name = "APC Access ID"
desc = "A special ID card that allows access to APC terminals."
icon_state = "centcom_old"
access = list(access_engine_equip)
/obj/item/storage/backpack/old
max_combined_w_class = 12
// Equipment
/obj/item/clothing/head/helmet/space/nasavoid/old
name = "Engineering Void Helmet"
desc = "A CentCom engineering dark red space suit helmet. While old and dusty, it still gets the job done."
icon_state = "void-red"
item_state = "void"
/obj/item/clothing/suit/space/nasavoid/old
name = "Engineering Voidsuit"
icon_state = "void-red"
item_state = "void"
desc = "A CentCom engineering dark red space suit. Age has degraded the suit making is difficult to move around in."
slowdown = 4
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/multitool)
/obj/item/clothing/head/helmet/old
name = "degrading helmet"
desc = "Standard issue security helmet. Due to degradation the helmet's visor obstructs the users ability to see long distances."
tint = 2
/obj/item/clothing/suit/armor/vest/old
name = "degrading armor vest"
desc = "Older generation Type 1 armored vest. Due to degradation over time the vest is far less maneuverable to move in."
icon_state = "armor"
item_state = "armor"
slowdown = 1
/obj/item/gun/energy/laser/retro/old
name ="laser gun"
icon_state = "retro"
desc = "First generation lasergun, developed by Nanotrasen. Suffers from ammo issues but its unique ability to recharge its ammo without the need of a magazine helps compensate. You really hope someone has developed a better lasergun while you were in cryo."
ammo_type = list(/obj/item/ammo_casing/energy/lasergun/old)
ammo_x_offset = 3
/obj/item/ammo_casing/energy/lasergun/old
projectile_type = /obj/item/projectile/beam/laser
e_cost = 200
select_name = "kill"
/obj/item/gun/energy/e_gun/old
name = "prototype energy gun"
desc = "NT-P:01 Prototype Energy Gun. Early stage development of a unique laser rifle that has multifaceted energy lens allowing the gun to alter the form of projectile it fires on command."
icon_state = "protolaser"
ammo_x_offset = 2
ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/electrode/old)
/obj/item/ammo_casing/energy/electrode/old
e_cost = 1000
// Papers
/obj/item/paper/fluff/ruins/oldstation
name = "Cryo Awakening Alert"
info = "<B>**WARNING**</B><BR><BR>Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.<BR><BR>Immediate Objectives<br><br>1: Activate emergency power generator<br>2: Lift station lockdown on the bridge<br><br>Please locate the 'Damage Report' on the bridge for a detailed situation report."
/obj/item/paper/fluff/ruins/oldstation/damagereport
name = "Damage Report"
info = "<b>*Damage Report*</b><br><br><b>Alpha Station</b> - Destroyed<br><br><b>Beta Station</b> - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.<br><br><b>Charlie Station</b> - Intact. Loss of oxygen to eastern side of main corridor.<br><br><b>Delta Station</b> - Intact. <b>WARNING</b>: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.<br><br>Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
/obj/item/paper/fluff/ruins/oldstation/protosuit
name = "B01-RIG Hardsuit Report"
info = "<b>*Prototype Hardsuit*</b><br><br>The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off of a recovered pre-void war era united Earth government powered military \
exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by an operator.<br><br>The B01 however suffers \
a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \
resulting in the user being unable to see long distances.<br><br>The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments."
/obj/item/paper/fluff/ruins/oldstation/protohealth
name = "Health Analyser Report"
info = "<b>*Health Analyser*</b><br><br>The portable Health Analyser is essentially a handheld variant of a health analyser. Years of research have concluded with this device which is \
capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \
can understand.<br><br>The health analyser is expected to go into full production as standard issue medical kit."
/obj/item/paper/fluff/ruins/oldstation/protogun
name = "K14 Energy Gun Report"
info = "<b>*K14-Multiphase Energy Gun*</b><br><br>The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \
than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.<br><br>The weapon still suffers several drawbacks, its alternative, \
non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \
will form the backbone of our Energy weapon catalogue.<br><br>The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \
'disable' setting in an attempt to bypass the ammo issues."
/obj/item/paper/fluff/ruins/oldstation/protosing
name = "Singularity Generator"
info = "<b>*Singularity Generator*</b><br><br>Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \
ratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction.. Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \
operational.<br><br>The Singularity aims to alter this, a functional Singularity is essentially a controlled Black Hole, a Black Hole that generates far more power than Fusion or Fission \
generators can ever hope to produce. "
/obj/item/paper/fluff/ruins/oldstation/protoinv
name = "Laboratory Inventory"
info = "<b>*Inventory*</b><br><br>(1) Prototype Hardsuit<br><br>(1)Health Analyser<br><br>(1)Prototype Energy Gun<br><br>(1)Singularity Generation Disk<br><br><b>DO NOT REMOVE WITHOUT \
THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION</b>"
/obj/item/paper/fluff/ruins/oldstation/report
name = "Crew Reawakening Report"
info = "Artificial Program's report to surviving crewmembers.<br><br>Crew were placed into cryostasis on March 10th, 2445.<br><br>Crew were awoken from cryostasis around June, 2557.<br><br> \
<b>SIGNIFICANT EVENTS OF NOTE</b><br>1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radiation detectors showed no residual \
radiation on station. Deduction, primarily detector was malfunctioning and was producing a radiation signal when there was none.<br><br>2: A data burst from a nearby Nanotrasen Space \
Station was received, this data burst contained research data that has been uploaded to our RnD labs.<br><br>3: Unknown invasion force has occupied Delta station."
/obj/item/paper/fluff/ruins/oldstation/generator_manual
name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual"
info = "You can barely make out a faded sentence... <br><br> Wrench down the generator on top of a wire node connected to either a SMES input terminal or the power grid."
//Old Prototype Hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/ancient
name = "prototype RIG hardsuit helmet"
desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
item_color = "ancient"
resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/space/hardsuit/ancient
name = "prototype RIG hardsuit"
desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however."
icon_state = "hardsuit-ancient"
item_state = "anc_hardsuit"
armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
slowdown = 3
resistance_flags = FIRE_PROOF
var/footstep = 1
/obj/item/clothing/suit/space/hardsuit/ancient/on_mob_move()
var/mob/living/carbon/human/H = loc
if(!istype(H) || H.wear_suit != src)
return
if(footstep > 1)
playsound(src, 'sound/effects/servostep.ogg', 100, 1)
footstep = 0
else
footstep++
..()
// Chemical bottles
/obj/item/reagent_containers/glass/bottle/aluminum
name = "aluminum bottle"
list_reagents = list("aluminum" = 30)
/obj/item/reagent_containers/glass/bottle/hydrogen
name = "hydrogen bottle"
list_reagents = list("hydrogen" = 30)
/obj/item/reagent_containers/glass/bottle/lithium
name = "lithium bottle"
list_reagents = list("lithium" = 30)
/obj/item/reagent_containers/glass/bottle/carbon
name = "carbon bottle"
list_reagents = list("carbon" = 30)
/obj/item/reagent_containers/glass/bottle/nitrogen
name = "nitrogen bottle"
list_reagents = list("nitrogen" = 30)
/obj/item/reagent_containers/glass/bottle/oxygen
name = "oxygen bottle"
list_reagents = list("oxygen" = 30)
/obj/item/reagent_containers/glass/bottle/fluorine
name = "fluorine bottle"
list_reagents = list("fluorine" = 30)
/obj/item/reagent_containers/glass/bottle/sodium
name = "sodium bottle"
list_reagents = list("sodium" = 30)
/obj/item/reagent_containers/glass/bottle/silicon
name = "silicon bottle"
list_reagents = list("silicon" = 30)
/obj/item/reagent_containers/glass/bottle/phosphorus
name = "phosphorus bottle"
list_reagents = list("phosphorus" = 30)
/obj/item/reagent_containers/glass/bottle/sulfur
name = "sulfur bottle"
list_reagents = list("sulfur" = 30)
/obj/item/reagent_containers/glass/bottle/chlorine
name = "chlorine bottle"
list_reagents = list("chlorine" = 30)
/obj/item/reagent_containers/glass/bottle/potassium
name = "potassium bottle"
list_reagents = list("potassium" = 30)
/obj/item/reagent_containers/glass/bottle/iron
name = "iron bottle"
list_reagents = list("iron" = 30)
/obj/item/reagent_containers/glass/bottle/copper
name = "copper bottle"
list_reagents = list("copper" = 30)
/obj/item/reagent_containers/glass/bottle/mercury
name = "mercury bottle"
list_reagents = list("mercury" = 30)
/obj/item/reagent_containers/glass/bottle/radium
name = "radium bottle"
list_reagents = list("radium" = 30)
/obj/item/reagent_containers/glass/bottle/water
name = "water bottle"
list_reagents = list("water" = 30)
/obj/item/reagent_containers/glass/bottle/ethanol
name = "ethanol bottle"
list_reagents = list("ethanol" = 30)
/obj/item/reagent_containers/glass/bottle/sugar
name = "sugar bottle"
list_reagents = list("sugar" = 30)
/obj/item/reagent_containers/glass/bottle/sacid
name = "sulphuric acid bottle"
list_reagents = list("sacid" = 30)
/obj/item/reagent_containers/glass/bottle/welding_fuel
name = "welding fuel bottle"
list_reagents = list("fuel" = 30)
/obj/item/reagent_containers/glass/bottle/silver
name = "silver bottle"
list_reagents = list("silver" = 30)
/obj/item/reagent_containers/glass/bottle/iodine
name = "iodine bottle"
list_reagents = list("iodine" = 30)
/obj/item/reagent_containers/glass/bottle/bromine
name = "bromine bottle"
list_reagents = list("bromine" = 30)
// Engines
/obj/structure/shuttle/engine/large
name = "engine"
opacity = 1
icon = 'icons/obj/2x2.dmi'
icon_state = "large_engine"
desc = "A very large bluespace engine used to propel very large ships."
bound_width = 64
bound_height = 64
appearance_flags = 0
// areas
//Ruin of ancient Space Station
/area/ruin/space/ancientstation
name = "Charlie Station Main Corridor"
icon_state = "green"
has_gravity = TRUE
/area/ruin/space/ancientstation/powered
name = "Powered Tile"
icon_state = "teleporter"
requires_power = FALSE
/area/ruin/space/ancientstation/space
name = "Exposed To Space"
icon_state = "teleporter"
has_gravity = FALSE
/area/ruin/space/ancientstation/atmo
name = "Beta Station Atmospherics"
icon_state = "red"
has_gravity = FALSE
/area/ruin/space/ancientstation/betanorth
name = "Beta Station North Corridor"
icon_state = "blue"
/area/ruin/space/ancientstation/solar
name = "Station Solar Array"
icon_state = "panelsAP"
/area/ruin/space/ancientstation/engi
name = "Charlie Station Engineering"
icon_state = "engine"
/area/ruin/space/ancientstation/comm
name = "Charlie Station Command"
icon_state = "captain"
/area/ruin/space/ancientstation/hydroponics
name = "Charlie Station Hydroponics"
icon_state = "garden"
/area/ruin/space/ancientstation/kitchen
name = "Charlie Station Kitchen"
icon_state = "kitchen"
/area/ruin/space/ancientstation/sec
name = "Charlie Station Security"
icon_state = "red"
/area/ruin/space/ancientstation/deltacorridor
name = "Delta Station Main Corridor"
icon_state = "green"
/area/ruin/space/ancientstation/proto
name = "Delta Station Prototype Lab"
icon_state = "toxlab"
/area/ruin/space/ancientstation/rnd
name = "Delta Station Research and Development"
icon_state = "toxlab"
/area/ruin/space/ancientstation/hivebot
name = "Hivebot Mothership"
icon_state = "teleporter"
// Mob Spawners
//Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse.
/obj/effect/mob_spawn/human/oldsec
name = "old cryogenics pod"
desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant."
mob_name = "a security officer"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "<span class='big bold'>You are a security officer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
Work as a team with your fellow survivors and do not abandon them.</b>"
uniform = /obj/item/clothing/under/retro/security
shoes = /obj/item/clothing/shoes/jackboots
id = /obj/item/card/id/away/old/sec
r_pocket = /obj/item/restraints/handcuffs
l_pocket = /obj/item/flash
assignedrole = "Ancient Crew"
/obj/effect/mob_spawn/human/oldsec/Destroy()
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
return ..()
/obj/effect/mob_spawn/human/oldmed
name = "old cryogenics pod"
desc = "A humming cryo pod. You can barely recognise a medical uniform underneath the built up ice. The machine is attempting to wake up its occupant."
mob_name = "a medical doctor"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "<span class='big bold'>You are a medical working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
Work as a team with your fellow survivors and do not abandon them.</b>"
uniform = /obj/item/clothing/under/retro/medical
shoes = /obj/item/clothing/shoes/black
id = /obj/item/card/id/away/old/med
l_pocket = /obj/item/stack/medical/ointment
r_pocket = /obj/item/stack/medical/ointment
assignedrole = "Ancient Crew"
/obj/effect/mob_spawn/human/oldmed/Destroy()
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
return ..()
/obj/effect/mob_spawn/human/oldeng
name = "old cryogenics pod"
desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant."
mob_name = "an engineer"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "<span class='big bold'>You are an engineer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
Work as a team with your fellow survivors and do not abandon them.</b>"
uniform = /obj/item/clothing/under/retro/engineering
shoes = /obj/item/clothing/shoes/workboots
id = /obj/item/card/id/away/old/eng
gloves = /obj/item/clothing/gloves/color/fyellow/old
l_pocket = /obj/item/tank/emergency_oxygen
assignedrole = "Ancient Crew"
/obj/effect/mob_spawn/human/oldeng/Destroy()
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
return ..()
/obj/effect/mob_spawn/human/oldsci
name = "old cryogenics pod"
desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant."
mob_name = "a scientist"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "<span class='big bold'>You are a scientist working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
Work as a team with your fellow survivors and do not abandon them.</b>"
uniform = /obj/item/clothing/under/retro/science
shoes = /obj/item/clothing/shoes/laceup
id = /obj/item/card/id/away/old/sci
l_pocket = /obj/item/stack/medical/bruise_pack
assignedrole = "Ancient Crew"
/obj/effect/mob_spawn/human/oldsci/Destroy()
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
return ..()
/obj/structure/showcase/machinery/oldpod
name = "damaged cryogenic pod"
desc = "A damaged cryogenic pod long since lost to time, including its former occupant..."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper-open"
/obj/structure/showcase/machinery/oldpod/used
name = "opened cryogenic pod"
desc = "A cryogenic pod that has recently discharged its occupant. The pod appears non-functional."
+1
View File
@@ -12,6 +12,7 @@
//OTHER//
/////////
var/datum/preferences/prefs = null
var/skip_antag = FALSE //TRUE when a player declines to be included for the selection process of game mode antagonists.
var/move_delay = 1
var/moving = null
var/adminobs = null
@@ -36,8 +36,16 @@
path = /obj/item/storage/box/matches
/datum/gear/cards
display_name = "a deck of cards"
path = /obj/item/toy/cards/deck
display_name = "a deck of standard cards"
path = /obj/item/deck/cards
/datum/gear/doublecards
display_name = "a double deck of standard cards"
path = /obj/item/deck/doublecards
/datum/gear/tarot
display_name = "a deck of tarot cards"
path = /obj/item/deck/tarot
/datum/gear/headphones
display_name = "a pair of headphones"
+11 -2
View File
@@ -48,8 +48,17 @@
item_color="yellow"
burn_state = FIRE_PROOF
New()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
/obj/item/clothing/gloves/color/fyellow/New()
..()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
/obj/item/clothing/gloves/color/fyellow/old
desc = "Old and worn out insulated gloves, hopefully they still work."
name = "worn out insulated gloves"
/obj/item/clothing/gloves/color/fyellow/old/New()
..()
siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75)
/obj/item/clothing/gloves/color/black
desc = "These gloves are fire-resistant."
@@ -96,6 +96,7 @@
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
H.do_attack_animation(C)
visible_message("<span class='danger'>[C] has been touched with [src] by [H]!</span>")
add_attack_logs(H, C, "Touched with stun gloves")
C.Stun(stun_strength)
C.Weaken(stun_strength)
C.apply_effect(STUTTER, stun_strength)
@@ -0,0 +1,37 @@
//Let's keep clothing sorting clean. This is for all the oldstation clothes.
/obj/item/clothing/under/retro/security
desc = "A (now) retro corporate security jumpsuit. It doesn't have any sort of robust fabric, good ol' NT cutting costs."
name = "retro security officer's uniform"
icon_state = "retro_sec"
item_state = "retro_sec"
item_color = "retro_sec"
displays_id = 0
flags_size = ONESIZEFITSALL
/obj/item/clothing/under/retro/medical
desc = "A once biologically resistant medical uniform. The high-vis stripes are faded and unreflective."
name = "retro medical officer's uniform"
icon_state = "retro_med"
item_state = "retro_med"
item_color = "retro_med"
displays_id = 0
flags_size = ONESIZEFITSALL
/obj/item/clothing/under/retro/engineering
desc = "A faded grimy engineering jumpsuit and overall combo. It's coated with oil, dust, and grit."
name = "retro engineering uniform"
icon_state = "retro_eng"
item_state = "retro_eng"
item_color = "retro_eng"
displays_id = 0
flags_size = ONESIZEFITSALL
/obj/item/clothing/under/retro/science
desc = "A faded polo and set of distinct white slacks. What a ridiculous tie."
name = "retro science officer's uniform"
icon_state = "retro_sci"
item_state = "retro_sci"
item_color = "retro_sci"
displays_id = 0
flags_size = ONESIZEFITSALL
+10
View File
@@ -339,6 +339,16 @@
time = 50
category = CAT_WEAPON
/datum/crafting_recipe/toxins_payload
name = "Toxins Payload Casing"
result = /obj/item/bombcore/toxins
reqs = list(
/obj/item/stock_parts/matter_bin = 1,
/obj/item/assembly/signaler = 1,
/obj/item/stack/sheet/metal = 2
)
category = CAT_WEAPON
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 60
+21 -1
View File
@@ -135,7 +135,7 @@
/obj/item/claymore/fluff/hit_reaction()
return 0
/obj/item/fluff/rsik_katana //Xydonus: Rsik Ugsharki
/obj/item/fluff/rsik_katana //Xydonus: Rsik Ugsharki Atan
name = "ceremonial katana"
desc = "A shimmering ceremonial golden katana, for the most discerning class of ninja. Looks expensive, and fragile."
icon = 'icons/obj/custom_items.dmi'
@@ -1020,6 +1020,26 @@
flags = NODROP|BLOCKHAIR
flags_inv = HIDEEARS
/obj/item/clothing/suit/hooded/hoodie/fluff/xydonus //Xydonus: Rsik Ugsharki Atan | Based off of the bomber jacket, but with a hood slapped on (for allowed suit storage)
name = "custom fit bomber jacket"
desc = "Made for Unathi who likes to show off their big horns."
icon = 'icons/obj/custom_items.dmi'
icon_state = "xydonus_jacket"
ignore_suitadjust = 0
hoodtype = /obj/item/clothing/head/hood/fluff/xydonus
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
/obj/item/clothing/head/hood/fluff/xydonus
name = "custom fit hood"
desc = "A hood with some horns <i>glued</i> to them, or something like that. Custom fit for a Unathi's head shape."
icon = 'icons/obj/custom_items.dmi'
icon_state = "xydonus_bomberhood"
body_parts_covered = HEAD
flags = NODROP|BLOCKHAIR
flags_inv = HIDEEARS
//////////// Uniforms ////////////
/obj/item/clothing/under/fluff/counterfeitguise_uniform // thatdanguy23 : Rissa Williams
icon = 'icons/obj/custom_items.dmi'
@@ -27,7 +27,7 @@
if(!reagents || !reagents.total_volume)
to_chat(user, "<span class='warning'> None of [src] left, oh no!</span>")
return FALSE
if(!is_drainable())
to_chat(user, "<span class='warning'> You need to open [src] first!</span>")
return FALSE
@@ -62,7 +62,7 @@
if(!proximity)
return
if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
to_chat(user, "<span class='warning'> [src] is empty.</span>")
return FALSE
@@ -70,7 +70,7 @@
if(target.reagents.holder_full())
to_chat(user, "<span class='warning'> [target] is full.</span>")
return FALSE
var/datum/reagent/refill
var/datum/reagent/refillName
if(isrobot(user))
@@ -388,8 +388,8 @@
list_reagents = list()
/obj/item/reagent_containers/food/drinks/oilcan
name = "Oil Injection Device"
desc = "A device with a spout on one end for use in replacing fluid in synthtics who have sprung leaks."
icon = 'icons/obj/surgery.dmi'
icon_state = "fixovein_old"
volume = 100
name = "oil can"
desc = "Contains oil intended for use on cyborgs, robots, and other synthetics."
icon = 'icons/goonstation/objects/oil.dmi'
icon_state = "oilcan"
volume = 100
@@ -0,0 +1,79 @@
/obj/structure/fermenting_barrel
name = "wooden barrel"
desc = "A large wooden barrel. You can ferment fruits and such inside it, or just use it to hold liquid."
icon = 'icons/obj/objects.dmi'
icon_state = "barrel"
density = TRUE
anchored = FALSE
container_type = DRAINABLE | AMOUNT_VISIBLE
pressure_resistance = 2 * ONE_ATMOSPHERE
max_integrity = 300
var/open = FALSE
var/speed_multiplier = 1 //How fast it distills. Defaults to 100% (1.0). Lower is better.
/obj/structure/fermenting_barrel/Initialize()
create_reagents(300) //Bluespace beakers, but without the portability or efficiency in circuits.
. = ..()
/obj/structure/fermenting_barrel/examine(mob/user)
. = ..()
to_chat(user, "<span class='notice'>It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] </span>")
/obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/G)
if(G.reagents)
G.reagents.trans_to(src, G.reagents.total_volume)
var/amount = G.seed.potency / 4
if(G.distill_reagent)
reagents.add_reagent(G.distill_reagent, amount)
else
var/data = list()
data["names"] = list("[initial(G.name)]" = 1)
data["color"] = G.filling_color
data["alcohol_perc"] = G.wine_power
if(G.wine_flavor)
data["tastes"] = list(G.wine_flavor = 1)
// else // Stub - Will implement when we port over tg's better taste system - I'd rather get the barrel in first.
// data["tastes"] = list(G.tastes[1] = 1)
reagents.add_reagent("fruit_wine", amount, data)
qdel(G)
playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE)
/obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params)
var/obj/item/reagent_containers/food/snacks/grown/G = I
if(istype(G))
if(!G.can_distill)
to_chat(user, "<span class='warning'>You can't distill this into anything...</span>")
return FALSE
else if(!user.drop_item())
to_chat(user, "<span class='warning'>[G] is stuck to your hand!</span>")
return FALSE
G.forceMove(src)
to_chat(user, "<span class='notice'>You place [G] into [src] to start the fermentation process.</span>")
addtimer(CALLBACK(src, .proc/makeWine, G), rand(80, 120) * speed_multiplier)
else if(I.is_refillable())
return FALSE // To refill via afterattack proc
else
return ..()
/obj/structure/fermenting_barrel/attack_hand(mob/user)
open = !open
if(open)
container_type = REFILLABLE | AMOUNT_VISIBLE
to_chat(user, "<span class='notice'>You open [src], letting you fill it.</span>")
else
container_type = DRAINABLE | AMOUNT_VISIBLE
to_chat(user, "<span class='notice'>You close [src], letting you draw from its tap.</span>")
update_icon()
/obj/structure/fermenting_barrel/update_icon()
if(open)
icon_state = "barrel_open"
else
icon_state = "barrel"
/datum/crafting_recipe/fermenting_barrel
name = "Wooden Barrel"
result = /obj/structure/fermenting_barrel
reqs = list(/obj/item/stack/sheet/wood = 30)
time = 50
category = CAT_PRIMAL
+6 -5
View File
@@ -8,12 +8,13 @@
icon = 'icons/obj/hydroponics/harvest.dmi'
var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
var/plantname = ""
var/bitesize_mod = 0
var/bitesize_mod = 0 // If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod)
var/splat_type = /obj/effect/decal/cleanable/plant_smudge
// If set, bitesize = 1 + round(reagents.total_volume / bitesize_mod)
dried_type = -1
// Saves us from having to define each stupid grown's dried_type as itself.
// If you don't want a plant to be driable (watermelons) set this to null in the time definition.
var/can_distill = TRUE //If FALSE, this object cannot be distilled into an alcohol.
var/distill_reagent //If NULL and this object can be distilled, it uses a generic fruit_wine reagent and adjusts its variables.
var/wine_flavor //If NULL, this is automatically set to the fruit's flavor. Determines the flavor of the wine if distill_reagent is NULL.
var/wine_power = 0.1 //Determines the boozepwr of the wine if distill_reagent is NULL. Uses 0.1 - 1.2 not tg's boozepower (divide by 100) else you'll end up with 1000% proof alcohol!
dried_type = -1 // Saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition.
burn_state = FLAMMABLE
origin_tech = "biotech=1"
+6 -1
View File
@@ -30,6 +30,7 @@
name = "ambrosia vulgaris branch"
desc = "This is a plant containing various healing chemicals."
origin_tech = "biotech=2"
wine_power = 0.2
// Ambrosia Deus
/obj/item/seeds/ambrosia/deus
@@ -50,6 +51,7 @@
icon_state = "ambrosiadeus"
filling_color = "#008B8B"
origin_tech = "biotech=4;materials=3"
wine_power = 0.5
//Ambrosia Gaia
/obj/item/seeds/ambrosia/gaia
@@ -74,6 +76,8 @@
origin_tech = "biotech=6;materials=5"
light_range = 3
seed = /obj/item/seeds/ambrosia/gaia
wine_power = 0.7
wine_flavor = "the earthmother's blessing"
// Ambrosia Cruciatus
/obj/item/seeds/ambrosia/cruciatus
@@ -83,4 +87,5 @@
reagents_add = list("thc" = 0.15, "kelotane" = 0.15, "bicaridine" = 0.1, "bath_salts" = 0.20, "plantmatter" = 0.05)
/obj/item/reagent_containers/food/snacks/grown/ambrosia/cruciatus
seed = /obj/item/seeds/ambrosia/cruciatus
seed = /obj/item/seeds/ambrosia/cruciatus
wine_power = 0.7
+3
View File
@@ -23,6 +23,7 @@
icon_state = "apple"
filling_color = "#FF4500"
bitesize = 100 // Always eat the apple in one bite
distill_reagent = "hcider"
// Posioned Apple
/obj/item/seeds/apple/poisoned
@@ -55,3 +56,5 @@
icon_state = "goldapple"
filling_color = "#FFD700"
origin_tech = "biotech=4;materials=5"
distill_reagent = null
wine_power = 0.5
+4
View File
@@ -23,6 +23,7 @@
trash = /obj/item/grown/bananapeel
filling_color = "#FFFF00"
bitesize = 5
distill_reagent = "bananahonk"
/obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is aiming the [name] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide.</span>")
@@ -74,6 +75,7 @@
icon_state = "mimana"
trash = /obj/item/grown/bananapeel/mimanapeel
filling_color = "#FFFFEE"
distill_reagent = "silencer"
/obj/item/grown/bananapeel/mimanapeel
seed = /obj/item/seeds/banana/mime
@@ -102,6 +104,8 @@
trash = /obj/item/grown/bananapeel/bluespace
filling_color = "#0000FF"
origin_tech = "biotech=3;bluespace=5"
wine_power = 0.6
wine_flavor = "slippery hypercubes"
/obj/item/grown/bananapeel/bluespace
seed = /obj/item/seeds/banana/bluespace
+3 -1
View File
@@ -25,6 +25,7 @@
icon_state = "soybeans"
filling_color = "#F0E68C"
bitesize_mod = 2
wine_power = 0.2
// Koibean
/obj/item/seeds/soya/koi
@@ -45,4 +46,5 @@
desc = "Something about these seems fishy."
icon_state = "koibeans"
filling_color = "#F0E68C"
bitesize_mod = 2
bitesize_mod = 2
wine_power = 0.4
+12
View File
@@ -25,6 +25,7 @@
gender = PLURAL
filling_color = "#FF00FF"
bitesize_mod = 2
distill_reagent = "gin"
// Poison Berries
/obj/item/seeds/berry/poison
@@ -44,6 +45,8 @@
desc = "Taste so good, you could die!"
icon_state = "poisonberrypile"
filling_color = "#C71585"
distill_reagent = null
wine_power = 0.35
// Death Berries
/obj/item/seeds/berry/death
@@ -65,6 +68,8 @@
desc = "Taste so good, you could die!"
icon_state = "deathberrypile"
filling_color = "#708090"
distill_reagent = null
wine_power = 0.5
// Glow Berries
/obj/item/seeds/berry/glow
@@ -89,6 +94,9 @@
filling_color = "#7CFC00"
origin_tech = "plasmatech=6"
light_color = "#006622"
distill_reagent = null
wine_power = 0.6
wine_flavor = "warmth"
// Cherries
/obj/item/seeds/cherry
@@ -118,6 +126,7 @@
gender = PLURAL
filling_color = "#FF0000"
bitesize_mod = 2
wine_power = 0.3
// Blue Cherries
/obj/item/seeds/cherry/blue
@@ -138,6 +147,7 @@
icon_state = "bluecherry"
filling_color = "#6495ED"
bitesize_mod = 2
wine_power = 0.5
// Grapes
/obj/item/seeds/grape
@@ -168,6 +178,7 @@
dried_type = /obj/item/reagent_containers/food/snacks/no_raisin
filling_color = "#FF1493"
bitesize_mod = 2
distill_reagent = "wine"
// Green Grapes
/obj/item/seeds/grape/green
@@ -186,3 +197,4 @@
name = "bunch of green grapes"
icon_state = "greengrapes"
filling_color = "#7FFF00"
distill_reagent = "cognac"
@@ -93,6 +93,7 @@
icon_state = "cannabis"
filling_color = "#00FF00"
bitesize_mod = 2
wine_power = 0.2
/obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow
@@ -100,18 +101,21 @@
name = "rainbow cannabis leaf"
desc = "Is it supposed to be glowing like that...?"
icon_state = "megacannabis"
wine_power = 0.6
/obj/item/reagent_containers/food/snacks/grown/cannabis/death
seed = /obj/item/seeds/cannabis/death
name = "death cannabis leaf"
desc = "Looks a bit dark. Oh well."
icon_state = "blackcannabis"
wine_power = 0.4
/obj/item/reagent_containers/food/snacks/grown/cannabis/white
seed = /obj/item/seeds/cannabis/white
name = "white cannabis leaf"
desc = "It feels smooth and nice to the touch."
icon_state = "whitecannabis"
wine_power = 0.1
/obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate
seed = /obj/item/seeds/cannabis/ultimate
@@ -119,3 +123,4 @@
desc = "You feel dizzy looking at it. What the fuck?"
icon_state = "ocannabis"
volume = 420
wine_power = 0.9
@@ -21,6 +21,7 @@
icon_state = "wheat"
filling_color = "#F0E68C"
bitesize_mod = 2
distill_reagent = "beer"
// Oat
/obj/item/seeds/wheat/oat
@@ -40,6 +41,7 @@
icon_state = "oat"
filling_color = "#556B2F"
bitesize_mod = 2
distill_reagent = "ale"
// Rice
/obj/item/seeds/wheat/rice
@@ -60,6 +62,7 @@
icon_state = "rice"
filling_color = "#FAFAD2"
bitesize_mod = 2
distill_reagent = "sake"
//Meatwheat - grows into synthetic meat
/obj/item/seeds/wheat/meat
@@ -80,6 +83,7 @@
filling_color = rgb(150, 0, 0)
bitesize_mod = 2
seed = /obj/item/seeds/wheat/meat
can_distill = FALSE
/obj/item/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user)
user.visible_message("<span class='notice'>[user] crushes [src] into meat.</span>", "<span class='notice'>You crush [src] into something that resembles meat.</span>")
+8 -5
View File
@@ -25,14 +25,15 @@
icon_state = "chilipepper"
filling_color = "#FF0000"
bitesize_mod = 2
wine_power = 0.2
// Ice Chili
/obj/item/seeds/chili/ice
name = "pack of ice pepper seeds"
desc = "These seeds grow into ice pepper plants."
name = "pack of chilly pepper seeds"
desc = "These seeds grow into chilly pepper plants."
icon_state = "seed-icepepper"
species = "chiliice"
plantname = "Ice Pepper Plants"
plantname = "Chilly Pepper Plants"
product = /obj/item/reagent_containers/food/snacks/grown/icepepper
lifespan = 25
maturation = 4
@@ -43,12 +44,13 @@
/obj/item/reagent_containers/food/snacks/grown/icepepper
seed = /obj/item/seeds/chili/ice
name = "ice pepper"
name = "chilly pepper"
desc = "It's a mutant strain of chili"
icon_state = "icepepper"
filling_color = "#0000CD"
bitesize_mod = 2
origin_tech = "biotech=4"
wine_power = 0.3
// Ghost Chili
/obj/item/seeds/chili/ghost
@@ -73,4 +75,5 @@
icon_state = "ghostchilipepper"
filling_color = "#F8F8FF"
bitesize_mod = 4
origin_tech = "biotech=4;magnets=5"
origin_tech = "biotech=4;magnets=5"
wine_power = 0.5
+4
View File
@@ -5,6 +5,7 @@
desc = "It's so sour, your face will twist."
icon_state = "lime"
bitesize_mod = 2
wine_power = 0.3
// Lime
/obj/item/seeds/lime
@@ -29,6 +30,7 @@
desc = "It's so sour, your face will twist."
icon_state = "lime"
filling_color = "#00FF00"
distill_reagent = "triple_sec"
// Orange
/obj/item/seeds/orange
@@ -104,6 +106,8 @@
desc = "Made for burning houses down."
icon_state = "firelemon"
bitesize_mod = 2
wine_power = 0.7
wine_flavor = "fire"
/obj/item/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user)
var/area/A = get_area(user)
@@ -25,6 +25,7 @@
icon_state = "cocoapod"
filling_color = "#FFD700"
bitesize_mod = 2
distill_reagent = "creme_de_cacao"
// Vanilla Pod
/obj/item/seeds/cocoapod/vanillapod
@@ -43,4 +44,5 @@
name = "vanilla pod"
desc = "Fattening... Mmmmm... vanilla."
icon_state = "vanillapod"
filling_color = "#FFD700"
filling_color = "#FFD700"
distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it.
+2
View File
@@ -24,6 +24,8 @@
filling_color = "#FFFF00"
trash = /obj/item/grown/corncob
bitesize_mod = 2
distill_reagent = "whiskey"
wine_power = 0.4
/obj/item/grown/corncob
name = "corn cob"
+3 -1
View File
@@ -22,6 +22,7 @@
icon_state = "eggplant"
filling_color = "#800080"
bitesize_mod = 2
wine_power = 0.2
// Egg-Plant
/obj/item/seeds/eggplant/eggy
@@ -41,4 +42,5 @@
icon_state = "eggyplant"
trash = /obj/item/reagent_containers/food/snacks/egg
filling_color = "#F8F8FF"
bitesize_mod = 2
bitesize_mod = 2
distill_reagent = "eggnog"
@@ -25,6 +25,7 @@
slot_flags = SLOT_HEAD
filling_color = "#FF6347"
bitesize_mod = 3
distill_reagent = "vermouth"
// Lily
/obj/item/seeds/poppy/lily
@@ -88,6 +89,7 @@
slot_flags = SLOT_HEAD
filling_color = "#E6E6FA"
bitesize_mod = 3
distill_reagent = "vermouth"
// Sunflower
@@ -145,6 +147,7 @@
slot_flags = SLOT_HEAD
filling_color = "#E6E6FA"
bitesize_mod = 2
distill_reagent = "absinthe"
// Novaflower
/obj/item/seeds/sunflower/novaflower
@@ -27,6 +27,7 @@
bitesize_mod = 2
var/stacktype = /obj/item/stack/tile/grass
var/tile_coefficient = 0.02 // 1/50
wine_power = 0.15
/obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user)
to_chat(user, "<span class='notice'>You prepare the astroturf.</span>")
@@ -65,3 +66,4 @@
desc = "The textile industry's dark secret."
icon_state = "carpetclump"
stacktype = /obj/item/stack/tile/carpet
can_distill = FALSE
+1
View File
@@ -95,3 +95,4 @@
icon_state = "kudzupod"
filling_color = "#6B8E23"
bitesize_mod = 2
wine_power = 0.2
+3
View File
@@ -25,6 +25,7 @@
w_class = WEIGHT_CLASS_NORMAL
filling_color = "#008000"
bitesize_mod = 3
wine_power = 0.4
// Holymelon
/obj/item/seeds/watermelon/holy
@@ -45,3 +46,5 @@
icon_state = "holymelon"
filling_color = "#FFD700"
dried_type = null
wine_power = 0.7 //Water to wine, baby.
wine_flavor = "divinity"
+4
View File
@@ -53,6 +53,7 @@
icon_state = "cabbage"
filling_color = "#90EE90"
bitesize_mod = 2
wine_power = 0.2
// Sugarcane
@@ -78,6 +79,7 @@
icon_state = "sugarcane"
filling_color = "#FFD700"
bitesize_mod = 2
distill_reagent = "rum"
// Gatfruit
@@ -108,6 +110,7 @@
origin_tech = "combat=6"
trash = /obj/item/gun/projectile/revolver
bitesize_mod = 2
wine_power = 0.9 //It burns going down, too.
//Cherry Bombs
/obj/item/seeds/cherry/bomb
@@ -129,6 +132,7 @@
seed = /obj/item/seeds/cherry/bomb
bitesize_mod = 2
volume = 125 //Gives enough room for the black powder at max potency
wine_power = 0.8
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
var/area/A = get_area(user)
@@ -1,6 +1,7 @@
/obj/item/reagent_containers/food/snacks/grown/mushroom
name = "mushroom"
bitesize_mod = 2
wine_power = 0.4
// Reishi
@@ -84,6 +85,7 @@
desc = "<I>Amanita Virosa</I>: Deadly poisonous basidiomycete fungus filled with alpha amanitin."
icon_state = "angel"
filling_color = "#C0C0C0"
wine_power = 0.6
// Liberty Cap
@@ -109,6 +111,8 @@
desc = "<I>Psilocybe Semilanceata</I>: Liberate yourself!"
icon_state = "libertycap"
filling_color = "#DAA520"
wine_power = 0.8
wine_flavor = "freedom"
// Plump Helmet
@@ -135,6 +139,7 @@
desc = "<I>Plumus Hellmus</I>: Plump, soft and s-so inviting~"
icon_state = "plumphelmet"
filling_color = "#9370DB"
distill_reagent = "manlydorf"
// Walking Mushroom
@@ -161,6 +166,7 @@
icon_state = "walkingmushroom"
filling_color = "#9370DB"
origin_tech = "biotech=4;programming=5"
can_distill = FALSE
/obj/item/reagent_containers/food/snacks/grown/mushroom/walkingmushroom/attack_self(mob/user)
if(istype(user.loc, /turf/space))
@@ -232,6 +238,7 @@
var/effect_path = /obj/structure/glowshroom
origin_tech = "biotech=4;plasmatech=6"
light_color = "#006622"
wine_power = 0.5
/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user)
if(istype(user.loc, /turf/space))
@@ -280,6 +287,8 @@
effect_path = /obj/structure/glowshroom/glowcap
origin_tech = "biotech=4;powerstorage=6;plasmatech=4"
light_color = "#8E0300"
wine_power = 0.6
wine_flavor = "warmth"
// Fungus/Mold
/obj/item/seeds/fungus
@@ -326,3 +335,5 @@
icon_state = "shadowshroom"
effect_path = /obj/structure/glowshroom/shadowshroom
origin_tech = "biotech=4;plasmatech=4;magnets=4"
wine_power = 0.6
wine_flavor = "strange coldness"
+4
View File
@@ -25,6 +25,8 @@
bitesize_mod = 2
slice_path = /obj/item/reagent_containers/food/snacks/onion_slice
slices_num = 2
wine_power = 0.2
wine_flavor = "pungentness"
/obj/item/seeds/onion/red
name = "pack of red onion seeds"
@@ -43,6 +45,8 @@
icon_state = "onion_red"
filling_color = "#C29ACF"
slice_path = /obj/item/reagent_containers/food/snacks/onion_slice/red
wine_power = 0.6
wine_flavor = "powerful pungentness"
/obj/item/reagent_containers/food/snacks/onion_slice
name = "onion slices"
+2 -1
View File
@@ -24,4 +24,5 @@
icon_state = "pineapple"
filling_color = "#e5b437"
w_class = WEIGHT_CLASS_NORMAL
bitesize_mod = 3
bitesize_mod = 3
wine_power = 0.4
+2
View File
@@ -25,6 +25,7 @@
icon_state = "potato"
filling_color = "#E9967A"
bitesize = 100
distill_reagent = "vodka"
/obj/item/reagent_containers/food/snacks/grown/potato/wedges
@@ -33,6 +34,7 @@
icon_state = "potato_wedges"
filling_color = "#E9967A"
bitesize = 100
distill_reagent = "sbiten"
/obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params)
@@ -23,6 +23,7 @@
icon_state = "pumpkin"
filling_color = "#FFA500"
bitesize_mod = 2
wine_power = 0.2
/obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params)
if(is_sharp(W))
@@ -52,3 +53,4 @@
icon_state = "blumpkin"
filling_color = "#87CEFA"
bitesize_mod = 2
wine_power = 0.5
+7 -1
View File
@@ -26,4 +26,10 @@
name = "strange plant"
desc = "What could this even be?"
icon_state = "crunchy"
bitesize_mod = 2
bitesize_mod = 2
/obj/item/reagent_containers/food/snacks/grown/random/Initialize()
. = ..()
wine_power = rand(0.1,1.5)
if(prob(1))
wine_power = 2.0
+4
View File
@@ -21,6 +21,7 @@
icon_state = "carrot"
filling_color = "#FFA500"
bitesize_mod = 2
wine_power = 0.3
/obj/item/reagent_containers/food/snacks/grown/carrot/wedges
name = "carrot wedges"
@@ -59,6 +60,7 @@
desc = "Closely related to carrots."
icon_state = "parsnip"
bitesize_mod = 2
wine_power = 0.35
// White-Beet
@@ -84,6 +86,7 @@
icon_state = "whitebeet"
filling_color = "#F4A460"
bitesize_mod = 2
wine_power = 0.4
// Red Beet
/obj/item/seeds/redbeet
@@ -107,3 +110,4 @@
desc = "You can't beat red beet."
icon_state = "redbeet"
bitesize_mod = 2
wine_power = 0.6
@@ -22,6 +22,7 @@
desc = "These aromatic tips of the tea plant can be dried to make tea."
icon_state = "tea_aspera_leaves"
filling_color = "#008000"
can_distill = FALSE
// Tea Astra
/obj/item/seeds/tea/astra
@@ -67,6 +68,7 @@
icon_state = "coffee_arabica"
filling_color = "#DC143C"
bitesize_mod = 2
distill_reagent = "kahlua"
// Coffee Robusta
/obj/item/seeds/coffee/robusta
+4 -1
View File
@@ -21,6 +21,7 @@
desc = "Dry them out to make some smokes."
icon_state = "tobacco_leaves"
filling_color = "#008000"
distill_reagent = "creme_de_menthe" //Menthol, I guess.
// Space Tobacco
/obj/item/seeds/tobacco/space
@@ -38,4 +39,6 @@
seed = /obj/item/seeds/tobacco/space
name = "space tobacco leaves"
desc = "Dry them out to make some space-smokes."
icon_state = "stobacco_leaves"
icon_state = "stobacco_leaves"
distill_reagent = null
wine_power = 0.5
+5
View File
@@ -22,6 +22,7 @@
splat_type = /obj/effect/decal/cleanable/tomato_smudge
filling_color = "#FF6347"
bitesize_mod = 2
distill_reagent = "enzyme"
// Blood Tomato
/obj/item/seeds/tomato/blood
@@ -43,6 +44,7 @@
splat_type = /obj/effect/gibspawner/generic
filling_color = "#FF0000"
origin_tech = "biotech=5"
distill_reagent = "bloodymary"
// Blue Tomato
@@ -89,6 +91,8 @@
desc = "So lubricated, you might slip through space-time."
icon_state = "bluespacetomato"
origin_tech = "biotech=4;bluespace=5"
distill_reagent = null
wine_power = 0.8
// Killer Tomato
@@ -117,6 +121,7 @@
var/awakening = 0
filling_color = "#FF0000"
origin_tech = "biotech=4;combat=5"
distill_reagent = "demonsblood"
/obj/item/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone)
if(awakening)
+8 -7
View File
@@ -45,9 +45,9 @@
/obj/machinery/logic_gate/nand/handle_logic()
if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER))
output_state = LOGIC_OFF //This can only output continuous signals
else //At least one input was ON/FLICKER, so output is off
output_state = LOGIC_OFF
output_state = LOGIC_OFF //Both inputs are ON/FLICKER, so output is off
else
output_state = LOGIC_ON //This can only output continuous signals
return
// NOR Gate
@@ -58,9 +58,9 @@
output_state = LOGIC_ON
/obj/machinery/logic_gate/nor/handle_logic()
if(input1_state == LOGIC_OFF ||input2_state == LOGIC_OFF)
if(input1_state == LOGIC_OFF && input2_state == LOGIC_OFF) //Both inputs are OFF, so output is ON
output_state = LOGIC_ON //This can only output continuous signals
else //Both inputs are ON, so output is OFF
else
output_state = LOGIC_OFF
return
@@ -71,14 +71,15 @@
icon_state = "logic_xor"
/obj/machinery/logic_gate/xor/handle_logic()
if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) || input2_state == LOGIC_OFF) //Only input1 is ON/FLICKER, so output matches input1
if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_OFF)) //Only input1 is ON/FLICKER, so output matches input1
output_state = input1_state
else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) || input1_state == LOGIC_OFF) //Only input2 is ON/FLICKER, so output matches input2
else if((input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) && (input1_state == LOGIC_OFF)) //Only input2 is ON/FLICKER, so output matches input2
output_state = input2_state
else //Both inputs are ON or OFF, so output is OFF
output_state = LOGIC_OFF
return
// XNOR Gate
/obj/machinery/logic_gate/xnor
name = "XNOR Gate"
+1 -1
View File
@@ -28,7 +28,7 @@
/obj/machinery/mineral/ore_redemption/New()
..()
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, /obj/item/stack)
files = new /datum/research/smelter(src)
component_parts = list()
component_parts += new /obj/item/circuitboard/ore_redemption(null)
+19 -13
View File
@@ -7,7 +7,7 @@
var/harvested_name = "shortened mushrooms"
var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large."
var/needs_sharp_harvest = TRUE
var/harvest = /obj/item/reagent_containers/food/snacks/ash_flora/shavings
var/harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings
var/harvest_amount_low = 1
var/harvest_amount_high = 3
var/harvest_time = 60
@@ -79,7 +79,7 @@
desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures."
harvested_name = "leafless mushrooms"
harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?"
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf
needs_sharp_harvest = FALSE
harvest_amount_high = 4
harvest_time = 20
@@ -95,7 +95,7 @@
desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems."
harvested_name = "small mushrooms"
harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms."
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap
harvest_amount_high = 4
harvest_time = 50
harvest_message_low = "You slice the cap off of a mushroom."
@@ -111,7 +111,7 @@
luminosity = 1
harvested_name = "tiny mushrooms"
harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back."
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem
harvest_amount_high = 4
harvest_time = 40
harvest_message_low = "You pick and slice the cap off of a mushroom, leaving the stem."
@@ -126,7 +126,7 @@
desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash."
harvested_name = "cacti"
harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash."
harvest = /obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit
harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
needs_sharp_harvest = FALSE
harvest_amount_high = 2
harvest_time = 10
@@ -149,45 +149,51 @@
H.visible_message("<span class='danger'>[H] steps on a cactus!</span>", \
"<span class='userdanger'>You step on a cactus!</span>")
/obj/item/reagent_containers/food/snacks/ash_flora
/obj/item/reagent_containers/food/snacks/grown/ash_flora
name = "mushroom shavings"
desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl."
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_shavings"
list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2)
w_class = WEIGHT_CLASS_TINY
wine_power = 0.2
/obj/item/reagent_containers/food/snacks/ash_flora/New()
/obj/item/reagent_containers/food/snacks/grown/ash_flora/New()
..()
pixel_x = rand(-4, 4)
pixel_y = rand(-4, 4)
/obj/item/reagent_containers/food/snacks/ash_flora/shavings //for actual crafting
/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings //for actual crafting
/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_leaf
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf
name = "mushroom leaf"
desc = "A leaf, from a mushroom."
list_reagents = list("nutriment" = 3, "vitfro" = 2, "nicotine" = 2)
icon_state = "mushroom_leaf"
wine_power = 0.4
/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_cap
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap
name = "mushroom cap"
desc = "The cap of a large mushroom."
list_reagents = list("lsd" = 2, "entpoly" = 4, "psilocybin" = 2)
icon_state = "mushroom_cap"
wine_power = 0.7
/obj/item/reagent_containers/food/snacks/ash_flora/mushroom_stem
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem
name = "mushroom stem"
desc = "A long mushroom stem. It's slightly glowing."
list_reagents = list("tinlux" = 2, "vitamin" = 1, "space_drugs" = 1)
icon_state = "mushroom_stem"
luminosity = 1
wine_power = 0.6
/obj/item/reagent_containers/food/snacks/ash_flora/cactus_fruit
/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
name = "cactus fruit"
list_reagents = list("vitamin" = 2, "nutriment" = 2, "vitfro" = 4)
desc = "A cactus fruit covered in a thick, reddish skin. And some ash."
icon_state = "cactus_fruit"
wine_power = 0.5
/obj/item/mushroom_bowl
name = "mushroom bowl"
@@ -200,6 +206,6 @@
/datum/crafting_recipe/mushroom_bowl
name = "Mushroom Bowl"
result = /obj/item/reagent_containers/food/drinks/mushroom_bowl
reqs = list(/obj/item/reagent_containers/food/snacks/ash_flora/shavings = 5)
reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5)
time = 30
category = CAT_PRIMAL
+1 -1
View File
@@ -83,7 +83,7 @@
/obj/machinery/mineral/processing_unit/New()
..()
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY)
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, TRUE, /obj/item/stack)
files = new /datum/research/smelter(src)
/obj/machinery/mineral/processing_unit/Destroy()
+2
View File
@@ -274,7 +274,9 @@
if(M.maxHealth != initial(M.maxHealth))
to_chat(user, "[M] already has a reinforced chassis!")
return
var/previous = M.maxHealth
M.maxHealth = 170
M.health += M.maxHealth - previous
to_chat(user, "You reinforce [M]'s chassis.")
qdel(src)
+1 -1
View File
@@ -16,7 +16,7 @@
/obj/machinery/mineral/mint/New()
..()
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM, MAT_TRANQUILLITE), MINERAL_MATERIAL_AMOUNT * 50)
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM, MAT_TRANQUILLITE), MINERAL_MATERIAL_AMOUNT * 50, FALSE, /obj/item/stack)
/obj/machinery/mineral/mint/process()
var/turf/T = get_step(src, input_dir)
+11 -1
View File
@@ -30,7 +30,9 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE
see_in_dark = 100
verbs += /mob/dead/observer/proc/dead_tele
verbs += list(
/mob/dead/observer/proc/dead_tele,
/mob/dead/observer/proc/open_spawners_menu)
// Our new boo spell.
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/boo(null))
@@ -677,3 +679,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
mind.transfer_to(new_char)
else
new_char.key = key
/mob/dead/observer/proc/open_spawners_menu()
set name = "Mob spawners menu"
set desc = "See all currently available ghost spawners"
set category = "Ghost"
var/datum/spawners_menu/menu = new /datum/spawners_menu(src)
menu.ui_interact(src)
+9
View File
@@ -281,6 +281,15 @@
flags = RESTRICTED | WHITELISTED
syllables = list("click","clack")
/datum/language/kidan/get_random_name()
var/new_name = "[pick(list("Vrax", "Krek", "Vriz", "Zrik", "Zarak", "Click", "Zerk", "Drax", "Zven", "Drexx"))]"
new_name += ", "
new_name += "[pick(list("Noble", "Worker", "Scout", "Builder", "Farmer", "Gatherer", "Soldier", "Guard", "Prospector"))]"
new_name += " of Clan "
new_name += "[pick(list("Tristan", "Zarlan", "Clack", "Kkraz", "Zramn", "Orlan", "Zrax"))]" //I ran out of ideas after the first two tbh -_-
return new_name
/datum/language/slime
name = "Bubblish"
desc = "The language of slimes. It's a mixture of bubbling noises and pops. Very difficult to speak without mechanical aid for humans."
@@ -1,14 +1,17 @@
/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)
if(!skipcatch)
if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode
if(canmove && !restrained())
if(istype(AM, /obj/item))
var/obj/item/I = AM
if(isturf(I.loc))
put_in_active_hand(I)
visible_message("<span class='warning'>[src] catches [I]!</span>")
throw_mode_off()
return 1
if(in_throw_mode && canmove && !restrained()) //Makes sure player is in throw mode
if(!istype(AM,/obj/item) || !isturf(AM.loc))
return FALSE
if(get_active_hand())
return FALSE
if(istype(AM, /obj/item/twohanded))
if(get_inactive_hand())
return FALSE
put_in_active_hand(AM)
visible_message("<span class='warning'>[src] catches [AM]!</span>")
throw_mode_off()
return TRUE
..()
/mob/living/carbon/water_act(volume, temperature, source)
+1 -1
View File
@@ -29,7 +29,7 @@
if("Yes")
if(!I)
return
if(!Adjacent(usr))
if(!Adjacent(target))
to_chat(usr, "<span class='warning'> You need to stay in reaching distance while giving an object.</span>")
to_chat(target, "<span class='warning'> [usr.name] moved too far away.</span>")
return
+12 -15
View File
@@ -58,9 +58,9 @@
add_to_all_human_data_huds()
/mob/living/carbon/human/Destroy()
. = ..()
QDEL_LIST(bodyparts)
splinted_limbs.Cut()
return ..()
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
@@ -730,25 +730,22 @@
if(hasHUD(usr, "security") && setcriminal != "Cancel")
found_record = 1
var/their_name = R.fields["name"]
var/their_rank = R.fields["rank"]
if(R.fields["criminal"] == "*Execute*")
to_chat(usr, "<span class='warning'>Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.</span>")
else
else
var/rank
if(ishuman(usr))
var/mob/living/carbon/human/U = usr
R.fields["comments"] += "Set to [setcriminal] by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
if(isrobot(usr))
rank = U.get_assignment()
else if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
R.fields["comments"] += "Set to [setcriminal] by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
if(isAI(usr))
var/mob/living/silicon/ai/U = usr
R.fields["comments"] += "Set to [setcriminal] by [U.name] (artificial intelligence) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
R.fields["criminal"] = setcriminal
log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [setcriminal], comment: [t1]")
spawn()
sec_hud_set_security_status()
rank = "[U.modtype] [U.braintype]"
else if(isAI(usr))
rank = "AI"
set_criminal_status(usr, R, setcriminal, t1, rank)
break // Git out of the securiy records loop!
if(found_record)
break // Git out of the general records
if(!found_record)
to_chat(usr, "<span class='warning'>Unable to locate a data core entry for this person.</span>")
@@ -538,7 +538,7 @@
/datum/species/proc/handle_hud_icons_health_side(mob/living/carbon/human/H)
if(H.healths)
if(H.stat == DEAD)
if(H.stat == DEAD || (H.status_flags & FAKEDEATH))
H.healths.icon_state = "health7"
else
switch(H.hal_screwyhud)
@@ -557,7 +557,7 @@
/datum/species/proc/handle_hud_icons_health_doll(mob/living/carbon/human/H)
if(H.healthdoll)
if(H.stat == DEAD)
if(H.stat == DEAD || (H.status_flags & FAKEDEATH))
H.healthdoll.icon_state = "healthdoll_DEAD"
if(H.healthdoll.overlays.len)
H.healthdoll.overlays.Cut()
@@ -628,7 +628,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
else
H.see_invisible = SEE_INVISIBLE_LIVING
if(H.client.eye != H)
if(H.client && H.client.eye != H)
var/atom/A = H.client.eye
if(A.update_remote_sight(H)) //returns 1 if we override all other sight updates.
return
+2 -2
View File
@@ -292,8 +292,8 @@
return
/mob/living/attack_animal(mob/living/simple_animal/M)
if(M.melee_damage_upper == 0)
M.custom_emote(1, "[M.friendly] [src]")
if((M.a_intent == INTENT_HELP && M.ckey) || M.melee_damage_upper == 0)
M.custom_emote(1, "[M.friendly] [src].")
return 0
else
if(M.attack_sound)
+1 -1
View File
@@ -274,7 +274,7 @@ proc/get_radio_key_from_channel(var/channel)
spawn(0)
if(loc && !isturf(loc))
var/atom/A = loc //Non-turf, let it handle the speech bubble
A.speech_bubble("hR[speech_bubble_test]", A.loc, speech_bubble_recipients)
A.speech_bubble("hR[speech_bubble_test]", A, speech_bubble_recipients)
else //Turf, leave speech bubbles to the mob
speech_bubble("h[speech_bubble_test]", src, speech_bubble_recipients)
+3 -3
View File
@@ -1119,15 +1119,15 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/check_unable(flags = 0)
if(stat == DEAD)
to_chat(usr, "<span class='warning'>You are dead!</span>")
to_chat(src, "<span class='warning'>You are dead!</span>")
return TRUE
if(lacks_power())
to_chat(usr, "<span class='warning'>Power systems failure!</span>")
to_chat(src, "<span class='warning'>Power systems failure!</span>")
return TRUE
if((flags & AI_CHECK_WIRELESS) && control_disabled)
to_chat(usr, "<span class='warning'>Wireless control is disabled!</span>")
to_chat(src, "<span class='warning'>Wireless control is disabled!</span>")
return TRUE
if((flags & AI_CHECK_RADIO) && aiRadio.disabledAi)
to_chat(src, "<span class='warning'>System Error - Transceiver Disabled!</span>")
+3 -3
View File
@@ -225,9 +225,9 @@
// See software.dm for Topic()
/mob/living/silicon/pai/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
M.custom_emote(1, "[M.friendly] [src]")
/mob/living/silicon/pai/attack_animal(mob/living/simple_animal/M)
if((M.a_intent == INTENT_HELP && M.ckey) || M.melee_damage_upper == 0)
M.custom_emote(1, "[M.friendly] [src].")
else
M.do_attack_animation(src)
if(M.attack_sound)
@@ -132,7 +132,7 @@
to_chat(user, "<span class='warning'>The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.</span>")
return
if(!allowed(usr))
if(!allowed(W))
to_chat(user, "<span class='warning'>Access denied.</span>")
return
@@ -158,7 +158,7 @@
if(emagged)
return
if(allowed(usr))
if(allowed(W))
shut_down()
else
to_chat(user, "<span class='warning'>Access denied.</span>")
@@ -223,6 +223,10 @@
health = 35 - (getBruteLoss() + getFireLoss())
update_stat("updatehealth([reason])")
/mob/living/silicon/robot/drone/death(gibbed)
. = ..(gibbed)
ghostize(can_reenter_corpse = 0)
//CONSOLE PROCS
/mob/living/silicon/robot/drone/proc/law_resync()
@@ -42,7 +42,10 @@
if(UNCONSCIOUS)
msg += "<span class='warning'>It doesn't seem to be responding.</span>\n"
if(DEAD)
msg += "<span class='deadsay'>It looks like its system is corrupted and requires a reset.</span>\n"
if(!suiciding)
msg += "<span class='deadsay'>It looks like its system is corrupted and requires a reset.</span>\n"
else
msg += "<span class='warning'>It looks like its system is corrupted beyond repair. There is no hope of recovery.</span>\n"
msg += "*---------*</span>"
if(print_flavor_text()) msg += "\n[print_flavor_text()]\n"
@@ -91,7 +91,7 @@
/mob/living/simple_animal/bot/medbot/syndicate/New()
..()
Radio.syndie = 1
Radio.syndiekey = new /obj/item/encryptionkey/syndicate
/mob/living/simple_animal/bot/medbot/syndicate/emagged
emagged = 2
@@ -32,24 +32,72 @@
melee_damage_upper = 8
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
var/chirp_sound = 'sound/misc/nymphchirp.ogg' //used in emote
speed = 0
stop_automated_movement = 0
turns_per_move = 4
var/list/donors = list()
var/ready_evolve = 0
holder_type = /obj/item/holder/diona
can_collar = 1
can_collar = TRUE
a_intent = INTENT_HELP
var/gestalt_alert = "merged with gestalt" //used in adding and clearing alert
var/evolve_donors = 5 //amount of blood donors needed before evolving
var/awareness_donors = 3 //amount of blood donors needed for understand language
var/nutrition_need = 500 //amount of nutrition needed before evolving
var/datum/action/innate/diona/merge/merge_action = new()
var/datum/action/innate/diona/evolve/evolve_action = new()
var/datum/action/innate/diona/steal_blood/steal_blood_action = new()
/datum/action/innate/diona/merge
name = "Merge with gestalt"
icon_icon = 'icons/mob/human_races/r_diona.dmi'
button_icon_state = "preview"
/datum/action/innate/diona/merge/Activate()
var/mob/living/simple_animal/diona/user = owner
user.merge()
/datum/action/innate/diona/evolve
name = "Evolve"
icon_icon = 'icons/obj/cloning.dmi'
button_icon_state = "pod_1"
/datum/action/innate/diona/evolve/Activate()
var/mob/living/simple_animal/diona/user = owner
user.evolve()
/datum/action/innate/diona/steal_blood
name = "Steal blood"
icon_icon = 'icons/obj/bloodpack.dmi'
button_icon_state = "full"
/datum/action/innate/diona/steal_blood/Activate()
var/mob/living/simple_animal/diona/user = owner
user.steal_blood()
/mob/living/simple_animal/diona/New()
..()
if(name == initial(name)) //To stop Pun-Pun becoming generic.
name = "[name] ([rand(1, 1000)])"
real_name = name
add_language("Rootspeak")
verbs += /mob/living/simple_animal/diona/proc/merge
merge_action.Grant(src)
evolve_action.Grant(src)
steal_blood_action.Grant(src)
/mob/living/simple_animal/diona/UnarmedAttack(var/atom/A)
if(isdiona(A) && (src in A.contents)) //can't attack your gestalt
visible_message("[src] wiggles around a bit.")
else
..()
/mob/living/simple_animal/diona/resist()
..()
split()
/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M)
//Let people pick the little buggers up.
@@ -57,88 +105,76 @@
if(isdiona(M))
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
verbs += /mob/living/simple_animal/diona/proc/split
verbs -= /mob/living/simple_animal/diona/proc/merge
throw_alert(gestalt_alert, /obj/screen/alert/nymph, new_master = src) //adds a screen alert that can call resist
forceMove(M)
else
get_scooped(M)
..()
/mob/living/simple_animal/diona/proc/merge()
set category = "Diona"
set name = "Merge with gestalt"
set desc = "Merge with another diona."
if(iscarbon(loc))
verbs -= /mob/living/simple_animal/diona/proc/merge
return
if(stat != CONSCIOUS)
return FALSE
var/list/choices = list()
for(var/mob/living/carbon/C in view(1,src))
if(!(Adjacent(C)) || !(C.client))
for(var/mob/living/carbon/human/H in view(1,src))
if(!(Adjacent(H)) || !isdiona(H))
continue
choices += H
if(ishuman(C))
var/mob/living/carbon/human/D = C
if(isdiona(D))
choices += C
if(!choices.len)
to_chat(src, "<span class='warning'>No suitable diona nearby.</span>")
return FALSE
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
if(!M || !src || !(Adjacent(M)))
return
if(!M || !src || !(Adjacent(M)) || stat != CONSCIOUS) //input can take a while, so re-validate
return FALSE
if(ishuman(M))
if(isdiona(M))
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
M.status_flags |= PASSEMOTES
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
forceMove(M)
verbs += /mob/living/simple_animal/diona/proc/split
verbs -= /mob/living/simple_animal/diona/proc/merge
throw_alert(gestalt_alert, /obj/screen/alert/nymph, new_master = src) //adds a screen alert that can call resist
return TRUE
else
return
return FALSE
/mob/living/simple_animal/diona/proc/split()
set category = "Diona"
set name = "Split from gestalt"
set desc = "Split away from your gestalt as a lone nymph."
if(!(iscarbon(loc)))
verbs -= /mob/living/simple_animal/diona/proc/split
return
if((stat != CONSCIOUS) || !isdiona(loc))
return FALSE
var/mob/living/carbon/human/D = loc
T = get_turf(src)
if(!T)
return FALSE
to_chat(loc, "You feel a pang of loss as [src] splits away from your biomass.")
to_chat(src, "You wiggle out of the depths of [loc]'s biomass and plop to the ground.")
forceMove(T)
var/hasMobs = FALSE
for(var/atom/A in D.contents)
if(istype(A, /mob/) || istype(A, /obj/item/holder))
hasMobs = TRUE
if(!hasMobs)
D.status_flags &= ~PASSEMOTES
var/mob/living/M = loc
clear_alert(gestalt_alert)
return TRUE
forceMove(get_turf(src))
verbs -= /mob/living/simple_animal/diona/proc/split
verbs += /mob/living/simple_animal/diona/proc/merge
if(istype(M))
for(var/atom/A in M.contents)
if(istype(A, /mob/living/simple_animal/borer) || istype(A, /obj/item/holder))
return
M.status_flags &= ~PASSEMOTES
/mob/living/simple_animal/diona/verb/evolve()
set category = "Diona"
set name = "Evolve"
set desc = "Grow to a more complex form."
if(donors.len < 5)
/mob/living/simple_animal/diona/proc/evolve()
if(stat != CONSCIOUS)
return FALSE
if(donors.len < evolve_donors)
to_chat(src, "<span class='warning'>You need more blood in order to ascend to a new state of consciousness...</span>")
return
return FALSE
if(nutrition < 500)
if(nutrition < nutrition_need)
to_chat(src, "<span class='warning'>You need to binge on weeds in order to have the energy to grow...</span>")
return
return FALSE
split()
if(isdiona(loc) && !split()) //if it's merged with diona, needs to able to split before evolving
return FALSE
visible_message("<span class='danger'>[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.</span>","<span class='danger'>You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.</span>")
var/mob/living/carbon/human/diona/adult = new(get_turf(loc))
@@ -162,28 +198,33 @@
unEquip(W)
qdel(src)
return TRUE
/mob/living/simple_animal/diona/verb/steal_blood()
set category = "Diona"
set name = "Steal Blood"
set desc = "Take a blood sample from a suitable donor."
/mob/living/simple_animal/diona/proc/steal_blood()
if(stat != CONSCIOUS)
return FALSE
var/list/choices = list()
for(var/mob/living/carbon/human/H in oview(1,src))
choices += H
if(Adjacent(H) && H.dna && !(NO_BLOOD in H.dna.species.species_traits))
choices += H
if(!choices.len)
to_chat(src, "<span class='warning'>No suitable blood donors nearby.</span>")
return FALSE
var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices
if(!M || !src)
return
if(!M || !src || !(Adjacent(M)) || stat != CONSCIOUS) //input can take a while, so re-validate
return FALSE
if(NO_BLOOD in M.dna.species.species_traits)
if(!M.dna || (NO_BLOOD in M.dna.species.species_traits))
to_chat(src, "<span class='warning'>That donor has no blood to take.</span>")
return
return FALSE
if(donors.Find(M.real_name))
to_chat(src, "<span class='warning'>That donor offers you nothing new.</span>")
return
return FALSE
visible_message("<span class='danger'>[src] flicks out a feeler and neatly steals a sample of [M]'s blood.</span>","<span class='danger'>You flick out a feeler and neatly steal a sample of [M]'s blood.</span>")
donors += M.real_name
@@ -195,13 +236,12 @@
update_progression()
/mob/living/simple_animal/diona/proc/update_progression()
if(!donors.len)
return
if(stat != CONSCIOUS || !donors.len)
return FALSE
if(donors.len == 5)
ready_evolve = 1
if(donors.len == evolve_donors)
to_chat(src, "<span class='noticealien'>You feel ready to move on to your next stage of growth.</span>")
else if(donors.len == 3)
else if(donors.len == awareness_donors)
universal_understand = 1
to_chat(src, "<span class='noticealien'>You feel your awareness expand, and realize you know how to understand the creatures around you.</span>")
else
@@ -219,7 +259,7 @@
return
/mob/living/simple_animal/diona/emote(act, m_type=1, message = null)
if(stat)
if(stat != CONSCIOUS)
return
var/on_CD = 0
@@ -237,6 +277,6 @@
if("chirp")
message = "<B>\The [src]</B> chirps!"
m_type = 2 //audible
playsound(src, 'sound/misc/nymphchirp.ogg', 40, 1, 1)
playsound(src, chirp_sound, 40, 1, 1)
..(act, m_type, message)
@@ -23,6 +23,11 @@
var/datum/mind/origin
var/egg_lain = 0
/mob/living/simple_animal/hostile/headcrab/examine(mob/user)
..()
if(stat == DEAD)
to_chat(desc = "It appears to be dead.")
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
egg.insert(victim)
@@ -18,7 +18,7 @@
var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
//These vars are related to how mobs locate and target
var/robust_searching = 0 //By default, mobs have a simple searching method, set this to 1 for the more scrutinous searching (stat_attack, stat_exclusive, etc), should be disabled on most mobs
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
@@ -101,7 +101,7 @@ Difficulty: Medium
animate(src, pixel_z = 0, time = 12)
/obj/effect/temp_visual/target
icon = 'icons/mob/actions.dmi'
icon = 'icons/mob/actions/actions.dmi'
icon_state = "sniper_zoom"
layer = MOB_LAYER - 0.1
luminosity = 2
@@ -65,7 +65,7 @@
/datum/action/innate/terrorspider/queen/queensense
name = "Hive Sense"
icon_icon = 'icons/mob/actions.dmi'
icon_icon = 'icons/mob/actions/actions.dmi'
button_icon_state = "mindswap"
/datum/action/innate/terrorspider/queen/queensense/Activate()
+7 -8
View File
@@ -1,6 +1,5 @@
/mob/new_player
var/ready = 0
var/skip_antag = 0 //For declining an antag roll this round.
var/spawning = 0 //Referenced when you want to delete the new_player later on in the code.
var/totalPlayers = 0 //Player counts for the Lobby tab
var/totalPlayersReady = 0
@@ -65,16 +64,16 @@
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
if(!ready) output += "<p><a href='byond://?src=[UID()];ready=1'>Declare Ready</A></p>"
else output += "<p><b>You are ready</b> (<a href='byond://?src=[UID()];ready=2'>Cancel</A>)</p>"
var/list/antags = client.prefs.be_special
if(antags && antags.len)
if(!skip_antag) output += "<p><a href='byond://?src=[UID()];skip_antag=1'>Global Antag Candidacy</A>"
else output += "<p><a href='byond://?src=[UID()];skip_antag=2'>Global Antag Candidacy</A>"
output += "<br /><small>You are <b>[skip_antag ? "ineligible" : "eligible"]</b> for all antag roles.</small></p>"
else
output += "<p><a href='byond://?src=[UID()];manifest=1'>View the Crew Manifest</A></p>"
output += "<p><a href='byond://?src=[UID()];late_join=1'>Join Game!</A></p>"
var/list/antags = client.prefs.be_special
if(antags && antags.len)
if(!client.skip_antag) output += "<p><a href='byond://?src=[UID()];skip_antag=1'>Global Antag Candidacy</A>"
else output += "<p><a href='byond://?src=[UID()];skip_antag=2'>Global Antag Candidacy</A>"
output += "<br /><small>You are <b>[client.skip_antag ? "ineligible" : "eligible"]</b> for all antag roles.</small></p>"
output += "<p><a href='byond://?src=[UID()];observe=1'>Observe</A></p>"
if(GLOB.join_tos)
@@ -172,7 +171,7 @@
new_player_panel_proc()
if(href_list["skip_antag"])
skip_antag = !skip_antag
client.skip_antag = !client.skip_antag
new_player_panel_proc()
if(href_list["refresh"])
+2 -1
View File
@@ -5,6 +5,8 @@
return
if(!AM || !isturf(AM.loc)) //if there's no object or the object being pulled is inside something: abort!
return
if(incapacitated())
return
if(!(AM.anchored))
AM.add_fingerprint(src)
@@ -14,7 +16,6 @@
if(AM == pulling)
return
stop_pulling()
if(AM.pulledby)
visible_message("<span class='danger'>[src] has pulled [AM] from [AM.pulledby]'s grip.</span>")
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
+2 -1
View File
@@ -71,7 +71,8 @@
update_icon()
attack_self(usr) //Update the browsed page.
if(winget(usr, "[name]", "is-visible") == "true") // NOT MY FAULT IT IS A BUILT IN PROC PLEASE DO NOT HIT ME
attack_self(usr) //Update the browsed page.
add_fingerprint(usr)
return
+5 -4
View File
@@ -110,10 +110,11 @@
H.emote("scream")
/obj/item/paper/AltClick(mob/user, obj/item/I)
var/mob/living/carbon/human/H = user
I = H.is_in_hands(/obj/item/paper)
if(I)
ProcFoldPlane(H, I)
if(ishuman(user))
var/mob/living/carbon/human/H = user
I = H.is_in_hands(/obj/item/paper)
if(I)
ProcFoldPlane(H, I)
else
..()
+1
View File
@@ -230,6 +230,7 @@
new/datum/data/pda/app/janitor,
new/datum/data/pda/app/supply,
new/datum/data/pda/app/mule_control,
new/datum/data/pda/app/status_display)
+4 -1
View File
@@ -115,7 +115,7 @@
#define CHARS_PER_LINE 5
#define FONT_SIZE "5pt"
#define FONT_COLOR "#09f"
#define FONT_STYLE "Arial Black"
#define FONT_STYLE "Small Fonts"
/obj/machinery/treadmill_monitor
name = "Treadmill Monitor"
@@ -126,6 +126,7 @@
density = 0
maptext_height = 26
maptext_width = 32
maptext_y = -1
var/on = 0 // if we should be metering or not
var/id = null // id of treadmill
@@ -200,6 +201,8 @@
//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display
// Stolen from status_display
/obj/machinery/treadmill_monitor/proc/update_display(var/line1, var/line2)
line1 = uppertext(line1)
line2 = uppertext(line2)
var/new_text = {"<div style="font-size:[FONT_SIZE];color:[FONT_COLOR];font:'[FONT_STYLE]';text-align:center;" valign="top">[line1]<br>[line2]</div>"}
if(maptext != new_text)
maptext = new_text
@@ -1236,3 +1236,107 @@
drink_icon = "synthignonglass"
drink_name = "Glass of Synthignon"
drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
/datum/reagent/consumable/ethanol/fruit_wine
name = "Fruit Wine"
id = "fruit_wine"
description = "A wine made from grown plants."
color = "#FFFFFF"
alcohol_perc = 0.35
taste_message = "bad coding"
can_synth = FALSE
var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit.
var/list/tastes = list("bad coding" = 1) //List of tastes. See above.
/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data)
names = data["names"]
tastes = data["tastes"]
alcohol_perc = data["alcohol_perc"]
color = data["color"]
generate_data_info(data)
/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount)
var/diff = (amount/volume)
if(diff < 1)
color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal.
else
color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly.
var/oldvolume = volume-amount
var/list/cachednames = data["names"]
for(var/name in names | cachednames)
names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume
var/list/cachedtastes = data["tastes"]
for(var/taste in tastes | cachedtastes)
tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume
alcohol_perc *= oldvolume
var/newzepwr = data["alcohol_perc"] * amount
alcohol_perc += newzepwr
alcohol_perc /= volume //Blending alcohol percentage to volume.
generate_data_info(data)
/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data)
var/minimum_percent = 0.15 //Percentages measured between 0 and 1.
var/list/primary_tastes = list()
var/list/secondary_tastes = list()
drink_name = "glass of [name]"
drink_desc = description
for(var/taste in tastes)
switch(tastes[taste])
if(minimum_percent*2 to INFINITY)
primary_tastes += taste
if(minimum_percent to minimum_percent*2)
secondary_tastes += taste
var/minimum_name_percent = 0.35
name = ""
var/list/names_in_order = sortTim(names, /proc/cmp_numeric_dsc, TRUE)
var/named = FALSE
for(var/fruit_name in names)
if(names[fruit_name] >= minimum_name_percent)
name += "[fruit_name] "
named = TRUE
if(named)
name += "wine"
else
name = "mixed [names_in_order[1]] wine"
var/alcohol_description
switch(alcohol_perc)
if(1.2 to INFINITY)
alcohol_description = "suicidally strong"
if(0.9 to 1.2)
alcohol_description = "rather strong"
if(0.7 to 0.9)
alcohol_description = "strong"
if(0.4 to 0.7)
alcohol_description = "rich"
if(0.2 to 0.4)
alcohol_description = "mild"
if(0 to 0.2)
alcohol_description = "sweet"
else
alcohol_description = "watery" //How the hell did you get negative boozepwr?
var/list/fruits = list()
if(names_in_order.len <= 3)
fruits = names_in_order
else
for(var/i in 1 to 3)
fruits += names_in_order[i]
fruits += "other plants"
var/fruit_list = english_list(fruits)
description = "A [alcohol_description] wine brewed from [fruit_list]."
var/flavor = ""
if(!primary_tastes.len)
primary_tastes = list("[alcohol_description] alcohol")
flavor += english_list(primary_tastes)
if(secondary_tastes.len)
flavor += ", with a hint of "
flavor += english_list(secondary_tastes)
taste_message = flavor
if(holder.my_atom)
holder.my_atom.on_reagent_change()
@@ -163,12 +163,12 @@
/datum/reagent/consumable/drink/cold/rewriter
name = "Rewriter"
description = "The secert of the sanctuary of the Libarian..."
description = "The secret of the sanctuary of the Librarian..."
id = "rewriter"
color = "#485000" // rgb:72, 080, 0
drink_icon = "rewriter"
drink_name = "Rewriter"
drink_desc = "The secert of the sanctuary of the Libarian..."
drink_desc = "The secret of the sanctuary of the Librarian..."
taste_message = "coffee...soda?"
/datum/reagent/consumable/drink/cold/rewriter/on_mob_life(mob/living/M)
@@ -275,6 +275,13 @@
color = "#FFFFFF"
taste_message = "the rainbow"
/datum/reagent/colorful_reagent/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!(NO_BLOOD in H.dna.species.species_traits) && !H.dna.species.exotic_blood)
H.dna.species.blood_color = "#[num2hex(rand(0, 255))][num2hex(rand(0, 255))][num2hex(rand(0, 255))]"
return ..()
/datum/reagent/colorful_reagent/reaction_mob(mob/living/simple_animal/M, method=TOUCH, volume)
if(isanimal(M))
M.color = pick(random_color_list)
@@ -116,6 +116,12 @@
reagent_state = LIQUID
color = "#FFA500"
/datum/reagent/sorium_vortex
name = "sorium_vortex"
id = "sorium_vortex"
reagent_state = LIQUID
color = "#FFA500"
/datum/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
@@ -124,6 +130,12 @@
color = "#800080"
taste_message = "the end of the world"
/datum/reagent/ldm_vortex
name = "LDM Vortex"
id = "ldm_vortex"
reagent_state = LIQUID
color = "#800080"
/datum/reagent/blackpowder
name = "Black Powder"
id = "blackpowder"
@@ -104,13 +104,15 @@
/datum/chemical_reaction/sorium_vortex
name = "sorium_vortex"
id = "sorium_vortex"
result = null
result = "sorium_vortex"
required_reagents = list("sorium" = 1)
result_amount = 1
min_temp = 474
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume + 1))
holder.remove_reagent("sorium_vortex", created_volume)
/datum/chemical_reaction/liquid_dark_matter
name = "Liquid Dark Matter"
@@ -129,13 +131,15 @@
/datum/chemical_reaction/ldm_vortex
name = "LDM Vortex"
id = "ldm_vortex"
result = null
result = "ldm_vortex"
required_reagents = list("liquid_dark_matter" = 1)
result_amount = 1
min_temp = 474
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume + 1))
holder.remove_reagent("ldm_vortex", created_volume)
/datum/chemical_reaction/blackpowder
name = "Black Powder"
@@ -95,7 +95,6 @@
spawn(5) reagents.clear_reagents()
return
else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(target.reagents && !target.reagents.total_volume)
to_chat(user, "<span class='warning'>[target] is empty and can't be refilled!</span>")
return
@@ -107,7 +106,7 @@
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [target].</span>")
else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
else if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
to_chat(user, "<span class='warning'>[src] is empty.</span>")
return
+23 -12
View File
@@ -1,6 +1,7 @@
#define DIRECTION_FORWARDS 1
#define DIRECTION_OFF 0
#define DIRECTION_REVERSED -1
#define IS_OPERATING (operating && can_conveyor_run())
GLOBAL_LIST_INIT(conveyor_belts, list()) //Saves us having to look through the entire machines list for our things
GLOBAL_LIST_INIT(conveyor_switches, list())
@@ -22,7 +23,6 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
var/operable = TRUE // Can this belt actually go?
var/list/affecting // the list of all items that will be moved this ptick
var/reversed = FALSE // set to TRUE to have the conveyor belt be reversed
speed_process = TRUE //gotta go fast
var/id //ID of the connected lever
// create a conveyor
@@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
/obj/machinery/conveyor/update_icon()
..()
if(operating && can_conveyor_run())
if(IS_OPERATING)
icon_state = "conveyor_started_[clockwise ? "cw" : "ccw"]"
if(reversed)
icon_state += "_r"
@@ -161,20 +161,30 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
update_icon()
/obj/machinery/conveyor/process()
if(!operating)
return
if(!can_conveyor_run())
if(!IS_OPERATING)
return
use_power(100)
affecting = loc.contents - src // moved items will be all in loc
if(!affecting)
return
sleep(1)
for(var/atom/movable/A in affecting)
if(!A.anchored)
if(A.loc == loc) // prevents the object from being affected if it's not currently here.
step(A,forwards)
var/still_stuff_to_move = FALSE
for(var/atom/movable/AM in affecting)
if(AM.anchored)
continue
still_stuff_to_move = TRUE
addtimer(CALLBACK(src, .proc/move_thing, AM), 1)
CHECK_TICK
if(!still_stuff_to_move && speed_process)
makeNormalProcess()
else if(still_stuff_to_move && !speed_process)
makeSpeedProcess()
/obj/machinery/conveyor/Crossed(atom/movable/AM)
if(!speed_process && !AM.anchored)
makeSpeedProcess()
..()
/obj/machinery/conveyor/proc/move_thing(atom/movable/AM)
if(!AM.anchored && AM.loc == loc)
step(AM, forwards)
/obj/machinery/conveyor/proc/can_conveyor_run()
if(stat & BROKEN)
@@ -475,3 +485,4 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
#undef DIRECTION_FORWARDS
#undef DIRECTION_OFF
#undef DIRECTION_REVERSED
#undef IS_OPERATING
+38 -35
View File
@@ -46,7 +46,7 @@
T.nicely_link_to_other_stuff(src)
//When the disposalsoutlet is forcefully moved. Due to meteorshot (not the recall spell)
/obj/machinery/disposal/Moved(atom/OldLoc, Dir)
/obj/machinery/disposal/Moved(atom/OldLoc, Dir)
. = ..()
eject()
var/ptype = istype(src, /obj/machinery/disposal/deliveryChute) ? PIPE_DISPOSALS_CHUTE : PIPE_DISPOSALS_BIN //Check what disposaltype it is
@@ -1220,24 +1220,27 @@
// if not entering from disposal bin,
// transfer to linked object (outlet or bin)
/obj/structure/disposalpipe/trunk/transfer(var/obj/structure/disposalholder/H)
/obj/structure/disposalpipe/trunk/transfer(obj/structure/disposalholder/H)
if(!H)
return
if(H.dir == DOWN) // we just entered from a disposer
return ..() // so do base transfer proc
// otherwise, go to the linked object
if(linked)
var/obj/structure/disposaloutlet/O = linked
if(istype(O) && (H))
O.expel(H) // expel at outlet
else
var/obj/machinery/disposal/D = linked
if(H)
D.expel(H) // expel at disposal
else
if(H)
src.expel(H, src.loc, 0) // expel at turf
return null
if(!linked)
expel(H, loc, FALSE) // expel at turf
else if(istype(linked, /obj/structure/disposaloutlet))
var/obj/structure/disposaloutlet/DO = linked
for(var/atom/movable/AM in H)
AM.forceMove(DO)
qdel(H)
H.vent_gas(loc)
DO.expel()
else if(istype(linked, /obj/machinery/disposal))
var/obj/machinery/disposal/D = linked
H.forceMove(D)
D.expel(H) // expel at disposal
else //just in case
expel(H, loc, FALSE)
// nextdir
/obj/structure/disposalpipe/trunk/nextdir(var/fromdir)
@@ -1283,24 +1286,29 @@
if(T)
T.nicely_link_to_other_stuff(src)
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
/obj/structure/disposaloutlet/proc/expel(var/obj/structure/disposalholder/H, animation = 1)
/obj/structure/disposaloutlet/Destroy()
if(linkedtrunk)
linkedtrunk.remove_trunk_links()
expel(FALSE)
return ..()
// expel the contents of the outlet
/obj/structure/disposaloutlet/proc/expel(animation = TRUE)
if(animation)
flick("outlet-open", src)
playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
sleep(20) //wait until correct animation frame
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
if(H)
for(var/atom/movable/AM in H)
AM.forceMove(loc)
AM.pipe_eject(dir)
if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
spawn(5)
if(AM)
AM.throw_at(target, 3, 1)
H.vent_gas(src.loc)
qdel(H)
for(var/atom/movable/AM in contents)
AM.forceMove(loc)
AM.pipe_eject(dir)
if(istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
return
spawn(5)
if(QDELETED(AM))
return
AM.throw_at(target, 3, 1)
/obj/structure/disposaloutlet/attackby(var/obj/item/I, var/mob/user, params)
@@ -1339,7 +1347,7 @@
return
//When the disposalsoutlet is forcefully moved. Due to meteorshot or the recall item spell for instance
/obj/structure/disposaloutlet/Moved(atom/OldLoc, Dir)
/obj/structure/disposaloutlet/Moved(atom/OldLoc, Dir)
. = ..()
var/turf/T = OldLoc
if(T.intact)
@@ -1356,11 +1364,6 @@
C.density = 1
qdel(src)
/obj/structure/disposaloutlet/Destroy()
if(linkedtrunk)
linkedtrunk.remove_trunk_links()
return ..()
// called when movable is expelled from a disposal pipe or outlet
// by default does nothing, override for special behaviour
+1 -1
View File
@@ -22,7 +22,7 @@
/obj/machinery/r_n_d/New()
materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE, MAT_PLASTIC), 0,
FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
..()
wires["Red"] = 0
+2 -1
View File
@@ -21,7 +21,8 @@
var/dirt_count = 0
var/list/init_list = list()
/datum/space_level/New(z, name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT))
/datum/space_level/New(z, level_name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT))
name = level_name
zpos = z
flags = traits
build_space_destination_arrays()
+6 -3
View File
@@ -199,13 +199,16 @@
deal_damage(P.damage)
P.on_hit(src)
/obj/spacepod/AllowDrop()
return TRUE
/obj/spacepod/blob_act()
deal_damage(30)
return
/obj/spacepod/attack_animal(mob/living/simple_animal/user as mob)
if(user.melee_damage_upper == 0)
user.custom_emote(1, "[user.friendly] [src]")
/obj/spacepod/attack_animal(mob/living/simple_animal/user)
if((user.a_intent == INTENT_HELP && user.ckey) || user.melee_damage_upper == 0)
user.custom_emote(1, "[user.friendly] [src].")
else
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
deal_damage(damage)
+3 -1
View File
@@ -2,6 +2,8 @@
BLOOD SYSTEM
****************************************************/
#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations.
/mob/living/carbon/human/proc/suppress_bloodloss(amount)
if(bleedsuppress)
return
@@ -104,7 +106,7 @@
if(dna.species.exotic_blood)
var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()]
if(istype(R) && isturf(loc))
R.reaction_turf(get_turf(src), amt)
R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER)
/mob/living/proc/restore_blood()
blood_volume = initial(blood_volume)
+3 -4
View File
@@ -19,10 +19,9 @@
pixel_y = rand(-5, 5)
/obj/item/stack/ore/bluespace_crystal/attack_self(var/mob/user)
blink_mob(user)
user.drop_item()
user.visible_message("<span class='notice'>[user] crushes the [src]!</span>")
qdel(src)
if(use(1))
blink_mob(user)
user.visible_message("<span class='notice'>[user] crushes a [singular_name]!</span>")
/obj/item/stack/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L)
if(!is_teleport_allowed(L.z))