diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm
index 9c6af04b827..18d063a2641 100644
--- a/code/WorkInProgress/Mini/atmos_control.dm
+++ b/code/WorkInProgress/Mini/atmos_control.dm
@@ -141,7 +141,10 @@
//Sets the temperature the built-in heater/cooler tries to maintain.
if(env == "temperature")
- current.target_temperature = (selected[2] + selected[3])/2
+ if(current.target_temperature < selected[2])
+ current.target_temperature = selected[2]
+ if(current.target_temperature > selected[3])
+ current.target_temperature = selected[3]
spawn(1)
updateUsrDialog()
diff --git a/code/ZAS/Connection.dm b/code/ZAS/Connection.dm
index ee8a5470d8b..f9697207c60 100644
--- a/code/ZAS/Connection.dm
+++ b/code/ZAS/Connection.dm
@@ -75,21 +75,31 @@ connection
var/list/connections = air_master.turfs_with_connections[ref_A]
connections.Remove(src)
- //Ensure we delete the right values by sanity checkign right before deletion.
- Sanitize()
-
- //Remove connection from current zones.
+ //Remove connection from zones.
if(A)
if(A.zone && A.zone.connections)
A.zone.connections.Remove(src)
if(!A.zone.connections.len)
A.zone.connections = null
+
+ if(istype(zone_A) && (!A || A.zone != zone_A))
+ if(zone_A.connections)
+ zone_A.connections.Remove(src)
+ if(!zone_A.connections.len)
+ zone_A.connections = null
+
if(B)
if(B.zone && B.zone.connections)
B.zone.connections.Remove(src)
if(!B.zone.connections.len)
B.zone.connections = null
+ if(istype(zone_B) && (!B || B.zone != zone_B))
+ if(zone_B.connections)
+ zone_B.connections.Remove(src)
+ if(!zone_B.connections.len)
+ zone_B.connections = null
+
//Disconnect zones while handling unusual conditions.
// e.g. loss of a zone on a turf
if(A && A.zone && B && B.zone)
diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index 77fc507abcc..3cfccaeb841 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -11,6 +11,8 @@ Attach to transfer valve and open. BOOM.
*/
+
+
//Some legacy definitions so fires can be started.
atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return null
@@ -19,12 +21,21 @@ atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed
turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
+
turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
if(fire_protection > world.time-300) return
- var/datum/gas_mixture/air_contents = return_air()
- if(!air_contents || exposed_temperature < PLASMA_MINIMUM_BURN_TEMPERATURE)
+ var/datum/gas_mixture/air_contents = return_air(1)
+ if(!air_contents)
return 0
+ /*if(active_hotspot)
+ if(soh)
+ if(air_contents.toxins > 0.5 && air_contents.oxygen > 0.5)
+ if(active_hotspot.temperature < exposed_temperature)
+ active_hotspot.temperature = exposed_temperature
+ if(active_hotspot.volume < exposed_volume)
+ active_hotspot.volume = exposed_volume
+ return 1*/
var/igniting = 0
if(locate(/obj/fire) in src)
return 1
@@ -36,8 +47,9 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
return 0
if(! (locate(/obj/fire) in src))
-
- new /obj/fire(src,1000)
+ var/obj/fire/F = new(src,1000)
+ F.temperature = exposed_temperature
+ F.volume = CELL_VOLUME
//active_hotspot.just_spawned = (current_cycle < air_master.current_cycle)
//remove just_spawned protection if no longer processing this cell
@@ -59,7 +71,10 @@ obj
layer = TURF_LAYER
var
+ volume = CELL_VOLUME
+ temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
firelevel = 10000 //Calculated by gas_mixture.calculate_firelevel()
+ archived_firelevel = 0
process()
. = 1
@@ -77,7 +92,7 @@ obj
//Also get liquid fuels on the ground.
obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S
- var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate)
+ var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25)
//The reason we're taking a part of the air instead of all of it is so that it doesn't jump to
//the fire's max temperature instantaneously.
@@ -111,13 +126,10 @@ obj
//Change icon depending on the fuel, and thus temperature.
if(firelevel > 6)
icon_state = "3"
- SetLuminosity(7)
else if(firelevel > 2.5)
icon_state = "2"
- SetLuminosity(5)
else
icon_state = "1"
- SetLuminosity(3)
//Ensure flow temperature is higher than minimum fire temperatures.
flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature)
@@ -125,7 +137,7 @@ obj
//Burn the gas mixture.
flow.zburn(liquid)
if(fuel && fuel.moles <= 0.00001)
- air_contents.trace_gases.Remove(fuel)
+ del fuel
else
@@ -143,7 +155,7 @@ obj
for(var/mob/living/carbon/human/M in loc)
- M.FireBurn(firelevel) //Burn the humans!
+ M.FireBurn(temperature, min(max(0.1,firelevel / 20),10)) //Burn the humans!
New(newLoc,fl)
@@ -153,14 +165,13 @@ obj
del src
dir = pick(cardinal)
- SetLuminosity(3)
+ //sd_SetLuminosity(3,2,0)
firelevel = fl
air_master.active_hotspots.Add(src)
-
Del()
if (istype(loc, /turf/simulated))
- SetLuminosity(0)
+ //sd_SetLuminosity(0)
loc = null
air_master.active_hotspots.Remove(src)
@@ -168,34 +179,36 @@ obj
..()
-
turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again.
turf/proc/apply_fire_protection()
turf/simulated/apply_fire_protection()
fire_protection = world.time
-
datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid)
//This proc is similar to fire(), but uses a simple logarithm to calculate temp, and is thus more stable with ZAS.
if(temperature > PLASMA_MINIMUM_BURN_TEMPERATURE)
var
total_fuel = toxins
-
+ fuel_sources = 0 //We'll divide by this later so that fuel is consumed evenly.
datum/gas/volatile_fuel/fuel = locate() in trace_gases
if(fuel)
//Volatile Fuel
total_fuel += fuel.moles
+ fuel_sources++
if(liquid)
//Liquid Fuel
if(liquid.amount <= 0)
del liquid
else
- total_fuel += liquid.amount*15
+ total_fuel += liquid.amount
+ fuel_sources++
- if(! (fuel || toxins || liquid) )
- return 0 //If there's no fuel, there's no burn. Can't divide by zero anyway.
+ //Toxins
+ if(toxins > 0.3) fuel_sources++
+
+ if(!fuel_sources) return 0 //If there's no fuel, there's no burn. Can't divide by zero anyway.
if(oxygen > 0.3)
@@ -205,54 +218,46 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid)
//Reaches a maximum practical temperature of around 4500.
//Increase temperature.
- temperature = max( vsc.fire_temperature_multiplier*log(0.04*firelevel + 1.24) , temperature )
-
- var/total_reactants = min(oxygen, 2*total_fuel) + total_fuel
+ temperature = max( 1700*log(0.4*firelevel + 1.23) , temperature )
//Consume some gas.
- var/consumed_gas = max( min( total_reactants, vsc.fire_gas_combustion_ratio*firelevel ), 0.2)
+ var/consumed_gas = min(oxygen,0.05*firelevel,total_fuel) / fuel_sources
- oxygen -= min(oxygen, (total_reactants-total_fuel)*consumed_gas/total_reactants )
+ oxygen = max(0,oxygen-consumed_gas)
- toxins -= min(toxins, toxins*consumed_gas/total_reactants )
+ toxins = max(0,toxins-consumed_gas)
- carbon_dioxide += max(consumed_gas, 0)
+ carbon_dioxide += consumed_gas*2
if(fuel)
- fuel.moles -= fuel.moles*consumed_gas/total_reactants
+ fuel.moles -= consumed_gas
if(fuel.moles <= 0) del fuel
if(liquid)
- liquid.amount -= liquid.amount*consumed_gas/(total_reactants)
+ liquid.amount -= consumed_gas
if(liquid.amount <= 0) del liquid
update_values()
- return consumed_gas
+ return consumed_gas*fuel_sources
return 0
+
datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid)
//Calculates the firelevel based on one equation instead of having to do this multiple times in different areas.
var
datum/gas/volatile_fuel/fuel = locate() in trace_gases
+ liquid_concentration = 0
- var/total_fuel = toxins - 0.5
+ oxy_concentration = oxygen / volume
+ tox_concentration = toxins / volume
+ fuel_concentration = 0
- if(liquid)
- total_fuel += (liquid.amount*15)
+ if(fuel) fuel_concentration = (fuel.moles) / volume
+ if(liquid) liquid_concentration = (liquid.amount*15) / volume
+ return (oxy_concentration + tox_concentration + liquid_concentration + fuel_concentration)*100
- if(fuel)
- total_fuel += fuel.moles
-
- var/total_combustables = (total_fuel + oxygen)
- if(total_fuel <= 0 || oxygen <= 0)
- return 0
-
- return max( 0, vsc.fire_firelevel_multiplier*(total_combustables/(total_combustables + nitrogen))*log(2*total_combustables/oxygen)*log(total_combustables/total_fuel))
-
-
-/mob/living/carbon/human/proc/FireBurn(var/firelevel)
+/mob/living/carbon/human/proc/FireBurn(last_temperature, mx as num)
//Burns mobs due to fire. Respects heat transfer coefficients on various body parts.
- //Due to TG reworking how fireprotection works, this is kinda less meaningful.
var
head_exposure = 1
@@ -261,11 +266,8 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue
legs_exposure = 1
arms_exposure = 1
- var/mx = min(max(0.1,firelevel / 20),10)
- var/last_temperature = vsc.fire_temperature_multiplier*log(0.04*firelevel + 1.24)
-
//Get heat transfer coefficients for clothing.
- //skytodo: kill anyone who breaks things then orders me to fix them
+
for(var/obj/item/clothing/C in src)
if(l_hand == C || r_hand == C)
continue
@@ -292,5 +294,4 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue
apply_damage(0.4*mx*arms_exposure, BURN, "l_arm", 0, 0, "Fire")
apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire")
- //flash_pain()
-#undef ZAS_FIRE_CONSUMPTION_RATE
\ No newline at end of file
+ //flash_pain()
\ No newline at end of file
diff --git a/code/ZAS/ZAS_Zones.dm b/code/ZAS/ZAS_Zones.dm
index 66937ec6727..2f5d564b3b4 100644
--- a/code/ZAS/ZAS_Zones.dm
+++ b/code/ZAS/ZAS_Zones.dm
@@ -385,7 +385,7 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles, dbg_output)
// slowly than small rooms, preserving our good old "hollywood-style"
// oh-shit effect when large rooms get breached, but still having small
// rooms remain pressurized for long enough to make escape possible.
- share_size = max(1, max(size - 5, 1) + unsimulated_tiles.len)
+ share_size = max(1, max(size + 3, 1) + unsimulated_tiles.len)
correction_ratio = share_size / unsimulated_tiles.len
for(var/turf/T in unsimulated_tiles)
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 116136bfafb..661f4c43b38 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -80,17 +80,7 @@
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"]
-
- var/active = 0
- for(var/mob/M in player_list) if(M.name == name)
- // For dead ones, have a chance to get their status wrong
- if(M.stat == 2)
- active = M.x % 2 // Should be good enough, avoids their status flipping constantly
- break
- else if(M.client && M.client.inactivity <= 10 * 60 * 10)
- active = 1
- break
- isactive[name] = active ? "Active" : "SSD"
+ isactive[name] = t.fields["p_stat"]
//world << "[name]: [rank]"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 0329bbe8baf..3c39813f5f1 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -48,7 +48,10 @@
#define RCON_YES 3
//1000 joules equates to about 1 degree every 2 seconds for a single tile of air.
-#define MAX_ENERGY_CHANGE 2000
+#define MAX_ENERGY_CHANGE 1000
+
+#define MAX_TEMPERATURE 90
+#define MIN_TEMPERATURE -40
//all air alarms in area are connected via magic
/area
@@ -85,6 +88,7 @@
var/area_uid
var/area/alarm_area
var/danger_level = 0
+ var/buildstage = 2 //2 is built, 1 is building, 0 is frame.
var/target_temperature = T0C+20
var/regulating_temperature = 0
@@ -104,8 +108,26 @@
TLV["temperature"] = list(20, 40, 140, 160) // K
target_temperature = 90
- New()
+ New(var/loc, var/dir, var/building = 0)
..()
+
+ if(building)
+ if(loc)
+ src.loc = loc
+
+ if(dir)
+ src.dir = dir
+
+ buildstage = 0
+ wiresexposed = 1
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
+ pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
+ update_icon()
+ return
+
+ first_run()
+
+ proc/first_run()
alarm_area = get_area(src)
if (alarm_area.master)
alarm_area = alarm_area.master
@@ -128,7 +150,7 @@
process()
- if((stat & (NOPOWER|BROKEN)) || shorted)
+ if((stat & (NOPOWER|BROKEN)) || shorted || buildstage != 2)
return
var/turf/simulated/location = loc
@@ -137,18 +159,21 @@
var/datum/gas_mixture/environment = location.return_air()
//Handle temperature adjustment here.
- if(environment.temperature < target_temperature - 10 || environment.temperature > target_temperature + 10 || regulating_temperature)
+ if(environment.temperature < target_temperature - 2 || environment.temperature > target_temperature + 2 || regulating_temperature)
//If it goes too far, we should adjust ourselves back before stopping.
+ if(get_danger_level(target_temperature, TLV["temperature"]))
+ return
+
if(!regulating_temperature)
regulating_temperature = 1
visible_message("\The [src] clicks as it starts [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\
"You hear a click and a faint electronic hum.")
- if(target_temperature > T0C + 90)
- target_temperature = T0C + 90
+ if(target_temperature > T0C + MAX_TEMPERATURE)
+ target_temperature = T0C + MAX_TEMPERATURE
- if(target_temperature < T0C - 40)
- target_temperature = T0C - 40
+ if(target_temperature < T0C + MIN_TEMPERATURE)
+ target_temperature = T0C + MIN_TEMPERATURE
var/datum/gas_mixture/gas = location.remove_air(0.25*environment.total_moles)
var/heat_capacity = gas.heat_capacity()
@@ -480,6 +505,14 @@
var/wireFlag = AAlarmIndexToFlag[wireIndex]
return ((AAlarmwires & wireFlag) == 0)
+ proc/allWiresCut()
+ var/i = 1
+ while(i<=5)
+ if(AAlarmwires & AAlarmIndexToFlag[i])
+ return 0
+ i++
+ return 1
+
proc/cut(var/wireColor)
var/wireFlag = AAlarmWireColorToFlag[wireColor]
var/wireIndex = AAlarmWireColorToIndex[wireColor]
@@ -603,6 +636,9 @@
interact(mob/user)
user.set_machine(src)
+ if(buildstage!=2)
+ return
+
if ( (get_dist(src, user) > 1 ))
if (!istype(user, /mob/living/silicon))
user.machine = null
@@ -709,7 +745,7 @@ Toxins: [plasma_percent]%
else if (other_dangerlevel==1)
output += "Notice: Low Concentration of Unknown Particles Detected
"
- output += "Temperature: [environment.temperature]K
"
+ output += "Temperature: [environment.temperature]K ([round(environment.temperature - T0C, 0.1)]C)
"
//Overall status
output += "Local Status: "
@@ -727,7 +763,7 @@ Toxins: [plasma_percent]%
return output
proc/rcon_text()
- var/dat = "Remote Control:
"
+ var/dat = "
Remote Control: "
if(rcon_setting == RCON_NO)
dat += "Off"
else
@@ -741,7 +777,11 @@ Toxins: [plasma_percent]%
if(rcon_setting == RCON_YES)
dat += "On"
else
- dat += "On"
+ dat += "On | "
+
+ //Hackish, I know. I didn't feel like bothering to rework all of this.
+ dat += "Thermostat: [target_temperature - T0C]C |
"
+
return dat
proc/return_controls()
@@ -985,10 +1025,6 @@ table tr:first-child th:first-child { border: none;}
if(selected[3] > selected[4])
selected[3] = selected[4]
- //Sets the temperature the built-in heater/cooler tries to maintain.
- if(env == "temperature")
- target_temperature = (selected[2] + selected[3])/2
-
apply_mode()
if(href_list["screen"])
@@ -1015,6 +1051,16 @@ table tr:first-child th:first-child { border: none;}
mode = text2num(href_list["mode"])
apply_mode()
+ if(href_list["temperature"])
+ var/list/selected = TLV["temperature"]
+ var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE)
+ var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE)
+ var/input_temperature = input("What temperature would you like the system to mantain? (Capped between [min_temperature]C and [max_temperature]C)", "Thermostat Controls") as num|null
+ if(!input_temperature || input_temperature > max_temperature || input_temperature < min_temperature)
+ usr << "Temperature must be between [min_temperature]C and [max_temperature]C"
+ else
+ target_temperature = input_temperature + T0C
+
if (href_list["AAlarmwires"])
var/t1 = text2num(href_list["AAlarmwires"])
if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
@@ -1048,28 +1094,74 @@ table tr:first-child th:first-child { border: none;}
update_icon()
return
*/
- if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
- //user << "You pop the Air Alarm's maintence panel open."
- wiresexposed = !wiresexposed
- user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
- update_icon()
- return
+ src.add_fingerprint(user)
- if (wiresexposed && ((istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters))))
- return attack_hand(user)
+ switch(buildstage)
+ if(2)
+ if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
+ //user << "You pop the Air Alarm's maintence panel open."
+ wiresexposed = !wiresexposed
+ user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
+ update_icon()
+ return
+ if (wiresexposed && ((istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters))))
+ return attack_hand(user)
+
+ if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
+ if(stat & (NOPOWER|BROKEN))
+ user << "It does nothing"
+ return
+ else
+ if(allowed(usr) && !isWireCut(AALARM_WIRE_IDSCAN))
+ locked = !locked
+ user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface."
+ updateUsrDialog()
+ else
+ user << "\red Access denied."
+ return
+
+ if(1)
+ if(istype(W, /obj/item/weapon/cable_coil))
+ var/obj/item/weapon/cable_coil/coil = W
+ if(coil.amount < 5)
+ user << "You need more cable for this!"
+ return
+
+ user << "You wire \the [src]!"
+ coil.amount -= 5
+ if(!coil.amount)
+ del(coil)
+
+ buildstage = 2
+ update_icon()
+ first_run()
+
+ else if(istype(W, /obj/item/weapon/crowbar))
+ user << "You pry out the circuit!"
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ spawn(20)
+ var/obj/item/weapon/airalarm_electronics/circuit = new /obj/item/weapon/airalarm_electronics()
+ circuit.loc = user.loc
+ buildstage = 0
+ update_icon()
+ return
+ if(0)
+ if(istype(W, /obj/item/weapon/airalarm_electronics))
+ user << "You insert the circuit!"
+ del(W)
+ buildstage = 1
+ update_icon()
+
+ /* Commented out due to RUNTIMES, RUNTIMES EVERYWHERE.
+ else if(istype(W, /obj/item/weapon/wrench))
+ user << "You remove the fire alarm assembly from the wall!"
+ var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame()
+ frame.loc = user.loc
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ del(src) */
+ return
- else if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
- if(stat & (NOPOWER|BROKEN))
- user << "It does nothing"
- else
- if(allowed(usr) && !isWireCut(AALARM_WIRE_IDSCAN))
- locked = !locked
- user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface."
- updateUsrDialog()
- else
- user << "\red Access denied."
- return
return ..()
/obj/machinery/alarm/power_change()
@@ -1218,15 +1310,6 @@ FIRE ALARM
user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
else
user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
-
- else if (istype(W, /obj/item/weapon/wirecutters))
- buildstage = 1
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil()
- coil.amount = 5
- coil.loc = user.loc
- user << "You cut the wires from \the [src]"
- update_icon()
if(1)
if(istype(W, /obj/item/weapon/cable_coil))
var/obj/item/weapon/cable_coil/coil = W
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index d3e7e4c178c..81f58d19d0c 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -145,12 +145,19 @@
src.active1 = null
src.active2 = null
else if (href_list["login"])
- if (istype(usr, /mob/living/silicon))
+ if (istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.active2 = null
- src.authenticated = 1
+ src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
+ else if (istype(usr, /mob/living/silicon/robot))
+ src.active1 = null
+ src.active2 = null
+ src.authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ src.rank = R.braintype
+ src.screen = 1
else if (istype(src.scan, /obj/item/weapon/card/id))
src.active1 = null
src.active2 = null
@@ -388,7 +395,7 @@
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
counter++
- src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053
[]", src.authenticated, src.rank, time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
+ src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557
[t1]")
if (href_list["del_c"])
if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index deb6e9e8c88..ab7c7c08180 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -245,12 +245,19 @@ What a mess.*/
active2 = null
if("Log In")
- if (istype(usr, /mob/living/silicon))
- active1 = null
- active2 = null
- authenticated = 1
- rank = "AI"
- screen = 1
+ if (istype(usr, /mob/living/silicon/ai))
+ src.active1 = null
+ src.active2 = null
+ src.authenticated = usr.name
+ src.rank = "AI"
+ src.screen = 1
+ else if (istype(usr, /mob/living/silicon/robot))
+ src.active1 = null
+ src.active2 = null
+ src.authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ src.rank = R.braintype
+ src.screen = 1
else if (istype(scan, /obj/item/weapon/card/id))
active1 = null
active2 = null
@@ -362,7 +369,7 @@ What a mess.*/
var/counter = 1
while(active2.fields[text("com_[]", counter)])
counter++
- active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053
[]", authenticated, rank, time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
+ active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557
[t1]")
if ("Delete Record (ALL)")
if (active1)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 973b8de1d61..5bf46648228 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -23,7 +23,7 @@
"diamond"=0,
"plasma"=0,
"uranium"=0,
- "bananium"=0
+ //"bananium"=0 No need to state what it can no longer hold
)
var/res_max_amount = 200000
var/datum/research/files
@@ -89,7 +89,7 @@
/obj/item/mecha_parts/part/durand_right_leg,
/obj/item/mecha_parts/part/durand_armour
),
- "H.O.N.K"=list(
+ /*"H.O.N.K"=list(
/obj/item/mecha_parts/chassis/honker,
/obj/item/mecha_parts/part/honker_torso,
/obj/item/mecha_parts/part/honker_head,
@@ -97,7 +97,7 @@
/obj/item/mecha_parts/part/honker_right_arm,
/obj/item/mecha_parts/part/honker_left_leg,
/obj/item/mecha_parts/part/honker_right_leg
- ),
+ ), No need for HONK stuff*/
"Exosuit Equipment"=list(
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
@@ -111,9 +111,9 @@
///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar,
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar,
- /obj/item/mecha_parts/mecha_equipment/weapon/honker
+ ///obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar, HONK-related mech part
+ ///obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar, Also HONK-related
+ ///obj/item/mecha_parts/mecha_equipment/weapon/honker Thirdly HONK-related
),
"Robotic Upgrade Modules" = list(
@@ -680,8 +680,8 @@
type = /obj/item/stack/sheet/mineral/plasma
if("uranium")
type = /obj/item/stack/sheet/mineral/uranium
- if("bananium")
- type = /obj/item/stack/sheet/mineral/clown
+ /*if("bananium")
+ type = /obj/item/stack/sheet/mineral/clown Sorry, but no more clown mechs, even if you do manage to get to the clown planet.*/
else
return 0
var/result = 0
@@ -739,9 +739,9 @@
if(src.resources["diamond"] >= 2000)
var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc)
G.amount = round(src.resources["diamond"] / G.perunit)
- if(src.resources["bananium"] >= 2000)
+ /*if(src.resources["bananium"] >= 2000)
var/obj/item/stack/sheet/mineral/clown/G = new /obj/item/stack/sheet/mineral/clown(src.loc)
- G.amount = round(src.resources["bananium"] / G.perunit)
+ G.amount = round(src.resources["bananium"] / G.perunit) Sorry, but no bananium allowed*/
del(src)
return 1
else
@@ -765,8 +765,8 @@
material = "metal"
if(/obj/item/stack/sheet/glass)
material = "glass"
- if(/obj/item/stack/sheet/mineral/clown)
- material = "bananium"
+ /*if(/obj/item/stack/sheet/mineral/clown)
+ material = "bananium"*/
if(/obj/item/stack/sheet/mineral/uranium)
material = "uranium"
else
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 8e533cf37b2..33fc438c4ac 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -349,13 +349,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += ""
@@ -500,7 +499,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += "
"
dat += ""
-
+ if (41) //crew manifest
+ dat += "
Crew Manifest
"
+ dat += "Entries cannot be modified from this terminal.
"
+ if(data_core)
+ dat += data_core.get_manifest(1) // make it monochrome
+ dat += "
"
else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub.
dat += cart
@@ -572,6 +576,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
mode = 0
if("chatroom") // chatroom hub
mode = 5
+ if("41") //Manifest
+ mode = 41
//MAIN FUNCTIONS===================================
@@ -700,7 +706,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
difficulty += P.cartridge.access_engine
difficulty += P.cartridge.access_clown
difficulty += P.cartridge.access_janitor
- difficulty += P.cartridge.access_manifest * 2
else
difficulty += 2
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 546b70f28e5..f0e3ee98f17 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -11,7 +11,6 @@
var/access_engine = 0
var/access_atmos = 0
var/access_medical = 0
- var/access_manifest = 1 // Make all jobs able to access the manifest
var/access_clown = 0
var/access_mime = 0
var/access_janitor = 0
@@ -68,7 +67,6 @@
icon_state = "cart-s"
access_security = 1
access_medical = 1
- access_manifest = 1
janitor
@@ -132,13 +130,11 @@
head
name = "Easy-Record DELUXE"
icon_state = "cart-h"
- access_manifest = 1
access_status_display = 1
hop
name = "HumanResources9001"
icon_state = "cart-h"
- access_manifest = 1
access_status_display = 1
access_quartermaster = 1
access_janitor = 1
@@ -152,7 +148,6 @@
hos
name = "R.O.B.U.S.T. DELUXE"
icon_state = "cart-hos"
- access_manifest = 1
access_status_display = 1
access_security = 1
@@ -164,7 +159,6 @@
ce
name = "Power-On DELUXE"
icon_state = "cart-ce"
- access_manifest = 1
access_status_display = 1
access_engine = 1
access_atmos = 1
@@ -172,7 +166,6 @@
cmo
name = "Med-U DELUXE"
icon_state = "cart-cmo"
- access_manifest = 1
access_status_display = 1
access_reagent_scanner = 1
access_medical = 1
@@ -180,7 +173,6 @@
rd
name = "Signal Ace DELUXE"
icon_state = "cart-rd"
- access_manifest = 1
access_status_display = 1
access_reagent_scanner = 1
access_atmos = 1
@@ -194,7 +186,6 @@
name = "Value-PAK Cartridge"
desc = "Now with 200% more value!"
icon_state = "cart-c"
- access_manifest = 1
access_engine = 1
access_security = 1
access_medical = 1
@@ -276,14 +267,6 @@ Code:
[radio:code]
+
+
"}
- if (41) //crew manifest
-
- menu = "
Crew Manifest
"
- menu += "Entries cannot be modified from this terminal.
"
- if(data_core)
- menu += data_core.get_manifest(1) // make it monochrome
- menu += "
"
-
if (42) //status displays
menu = "
Station Status Display Interlink
"
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 0de996ceaf3..1e8bc3891b9 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -147,7 +147,7 @@
R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide
for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules)
R.internals = src
- R.icon_state="Miner+j"
+ //R.icon_state="Miner+j"
return 1
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index d4e291c1321..d14e54f10eb 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -449,12 +449,12 @@
if(S.brute_dam)
S.heal_damage(15,0,0,1)
if(user != M)
- user.visible_message("\red You patch some dents on \the [M]'s [S.display_name]",\
- "\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src]",\
+ user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src]",\
+ "\red You patch some dents on \the [M]'s [S.display_name]",\
"You hear a welder.")
else
- user.visible_message("\red You patch some dents on your [S.display_name]",\
- "\red \The [user] patches some dents on their [S.display_name] with \the [src]",\
+ user.visible_message("\red \The [user] patches some dents on their [S.display_name] with \the [src]",\
+ "\red You patch some dents on your [S.display_name]",\
"You hear a welder.")
else
user << "Nothing to fix!"
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index ec044dbed16..e5ced14d63b 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -5,7 +5,7 @@
temperature = TCMB
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
- heat_capacity = 700000
+// heat_capacity = 700000 No.
/turf/space/New()
if(!istype(src, /turf/space/transit))
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 23d9918d9cc..e37ac58fd96 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -462,7 +462,8 @@ client/proc/one_click_antag()
candidates.Remove(G)
if(candidates.len)
- var/raiders = 4
+ var/max_raiders = 6
+ var/raiders = max_raiders
//Spawns vox raiders and equips them.
for (var/obj/effect/landmark/L in world)
if(L.name == "Response Team")
@@ -484,18 +485,17 @@ client/proc/one_click_antag()
new_vox << "\red Don't forget to turn on your nitrogen internals!"
raiders--
- if(raiders > 4)
+ if(raiders > max_raiders)
return 0
else
return 0
return 1
/datum/admins/proc/create_vox_raider(obj/spawn_location, leader_chosen = 0)
+
var/mob/living/carbon/human/new_vox = new(spawn_location.loc)
new_vox.gender = pick(MALE, FEMALE)
- var/datum/preferences/A = new() //Randomize appearance for the raider.
- A.randomize_appearance_for(new_vox)
new_vox.h_style = "Short Vox Quills"
new_vox.regenerate_icons()
diff --git a/code/modules/admin/verbs/vox_raiders.dm b/code/modules/admin/verbs/vox_raiders.dm
index 409b1ef9bd7..b63362fbcd6 100644
--- a/code/modules/admin/verbs/vox_raiders.dm
+++ b/code/modules/admin/verbs/vox_raiders.dm
@@ -1,3 +1,5 @@
+var/global/vox_tick = 1
+
/mob/living/carbon/human/proc/equip_vox_raider()
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(src)
@@ -8,7 +10,7 @@
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(src), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(src), slot_gloves) // AS ABOVE.
- switch(rand(1,4)) // Come up with a better way of doing this - ticker of some sort maybe.
+ switch(vox_tick)
if(1) // Vox raider!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
@@ -41,14 +43,16 @@
W.cell.charge = 500
equip_to_slot_or_del(W, slot_r_hand)
+ var/obj/item/stack/rods/A = new(src)
+ A.amount = 20
+ equip_to_slot_or_del(A, slot_l_hand)
+
if(4) // Vox medic!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt) // Who needs actual surgical tools?
equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
- equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray(src), slot_l_store)
-
- equip_to_slot_or_del(new /obj/item/weapon/circular_saw(src), slot_l_hand)
+ equip_to_slot_or_del(new /obj/item/weapon/circular_saw(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/dartgun/vox/medical, slot_r_hand)
equip_to_slot_or_del(new /obj/item/clothing/mask/breath/vox(src), slot_wear_mask)
@@ -63,4 +67,7 @@
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
+ vox_tick++
+ if (vox_tick > 4) vox_tick = 1
+
return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 4dcc3833848..20f56dd0228 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -387,60 +387,50 @@
msg += "[t_He] [t_is] repulsively uncanny!\n"
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- if(usr.stat || H != usr) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
- return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten
+ if(hasHUD(usr,"security"))
+ var/perpname = "wot"
+ var/criminal = "None"
- var/perpname = "wot"
- var/criminal = "None"
-
- if(wear_id)
- var/obj/item/weapon/card/id/I = wear_id.GetID()
- if(I)
- perpname = I.registered_name
- else
- perpname = name
+ if(wear_id)
+ var/obj/item/weapon/card/id/I = wear_id.GetID()
+ if(I)
+ perpname = I.registered_name
else
perpname = name
+ else
+ perpname = name
- if(perpname)
- for (var/datum/data/record/E in data_core.general)
- if(E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if(R.fields["id"] == E.fields["id"])
- criminal = R.fields["criminal"]
-
-
- msg += "Criminal status: \[[criminal]\]\n"
- msg += "Security records: \[View\] \[Add comment\]\n"
- //msg += "\[Set Hostile Identification\]\n"
-
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- var/perpname = "wot"
- var/medical = "None"
-
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
-
+ if(perpname)
for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.general)
- if (R.fields["id"] == E.fields["id"])
- medical = R.fields["p_stat"]
+ if(E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.security)
+ if(R.fields["id"] == E.fields["id"])
+ criminal = R.fields["criminal"]
+ msg += "Criminal status: \[[criminal]\]\n"
+ msg += "Security records: \[View\] \[Add comment\]\n"
- msg += "Physical status: \[[medical]\]\n"
- msg += "Medical records: \[View\] \[Add comment\]\n"
+ if(hasHUD(usr,"medical"))
+ var/perpname = "wot"
+ var/medical = "None"
+
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.general)
+ if (R.fields["id"] == E.fields["id"])
+ medical = R.fields["p_stat"]
+
+ msg += "Physical status: \[[medical]\]\n"
+ msg += "Medical records: \[View\] \[Add comment\]\n"
if(print_flavor_text()) msg += "[print_flavor_text()]\n"
@@ -452,3 +442,26 @@
msg += "\n[t_He] is [pose]"
usr << msg
+
+//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
+/proc/hasHUD(mob/M as mob, hudtype)
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ switch(hudtype)
+ if("security")
+ return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud)
+ if("medical")
+ return istype(H.glasses, /obj/item/clothing/glasses/hud/health)
+ else
+ return 0
+ else if(istype(M, /mob/living/silicon/robot))
+ var/mob/living/silicon/robot/R = M
+ switch(hudtype)
+ if("security")
+ return istype(R.module_state_1, /obj/item/borg/sight/hud/sec) || istype(R.module_state_2, /obj/item/borg/sight/hud/sec) || istype(R.module_state_3, /obj/item/borg/sight/hud/sec)
+ if("medical")
+ return istype(R.module_state_1, /obj/item/borg/sight/hud/med) || istype(R.module_state_2, /obj/item/borg/sight/hud/med) || istype(R.module_state_3, /obj/item/borg/sight/hud/med)
+ else
+ return 0
+ else
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ae6c854872a..a14d16e6fd2 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -499,267 +499,258 @@
return
if (href_list["criminal"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
+ if(hasHUD(usr,"security"))
- /* // Uncomment if you want sechuds to need security access
- var/allowed_access = 0
- if(H.wear_id)
- var/list/access = H.wear_id.GetAccess()
- if(access_security in access)
- allowed_access = 1
- return
-
- if(!allowed_access)
- H << "ERROR: Invalid Access"
- return
- */
-
- var/modified = 0
- var/perpname = "wot"
- if(wear_id)
- var/obj/item/weapon/card/id/I = wear_id.GetID()
- if(I)
- perpname = I.registered_name
- else
- perpname = name
+ var/modified = 0
+ var/perpname = "wot"
+ if(wear_id)
+ var/obj/item/weapon/card/id/I = wear_id.GetID()
+ if(I)
+ perpname = I.registered_name
else
perpname = name
+ else
+ perpname = name
- if(perpname)
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if (R.fields["id"] == E.fields["id"])
-
- var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
-
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- if(setcriminal != "Cancel")
- R.fields["criminal"] = setcriminal
- modified = 1
-
- spawn()
- H.handle_regular_hud_updates()
-
- if(!modified)
- usr << "\red Unable to locate a data core entry for this person."
-
- if (href_list["secrecord"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- var/perpname = "wot"
- var/read = 0
-
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
+ if(perpname)
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- usr << "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]"
- usr << "Minor Crimes: [R.fields["mi_crim"]]"
- usr << "Details: [R.fields["mi_crim_d"]]"
- usr << "Major Crimes: [R.fields["ma_crim"]]"
- usr << "Details: [R.fields["ma_crim_d"]]"
- usr << "Notes: [R.fields["notes"]]"
- usr << "\[View Comment Log\]"
- read = 1
- if(!read)
- usr << "\red Unable to locate a data core entry for this person."
+ var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
- if (href_list["secrecordComment"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- var/perpname = "wot"
- var/read = 0
-
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if (R.fields["id"] == E.fields["id"])
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- read = 1
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- usr << text("[]", R.fields[text("com_[]", counter)])
- counter++
- if (counter == 1)
- usr << "No comment found"
- usr << "\[Add comment\]"
-
- if(!read)
- usr << "\red Unable to locate a data core entry for this person."
-
- if (href_list["secrecordadd"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- var/perpname = "wot"
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if (R.fields["id"] == E.fields["id"])
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
- var/t1 = copytext(sanitize(input("Add Comment:", "Sec. records", null, null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || src.stat || src.restrained() || !(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))))
- return
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- counter++
- R.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053
[]",H.get_authentification_name(), H.get_assignment(), time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
-
- if (href_list["medical"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- var/perpname = "wot"
- var/modified = 0
-
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
-
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.general)
- if (R.fields["id"] == E.fields["id"])
-
- var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*Deceased*", "*Unconscious*", "Physically Unfit", "Active", "Cancel")
-
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- if(setmedical != "Cancel")
- R.fields["p_stat"] = setmedical
+ if(hasHUD(usr, "security"))
+ if(setcriminal != "Cancel")
+ R.fields["criminal"] = setcriminal
modified = 1
spawn()
- H.handle_regular_hud_updates()
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/U = usr
+ U.handle_regular_hud_updates()
+ if(istype(usr,/mob/living/silicon/robot))
+ var/mob/living/silicon/robot/U = usr
+ U.handle_regular_hud_updates()
- if(!modified)
- usr << "\red Unable to locate a data core entry for this person."
+ if(!modified)
+ usr << "\red Unable to locate a data core entry for this person."
+
+ if (href_list["secrecord"])
+ if(hasHUD(usr,"security"))
+ var/perpname = "wot"
+ var/read = 0
+
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.security)
+ if (R.fields["id"] == E.fields["id"])
+ if(hasHUD(usr,"security"))
+ usr << "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]"
+ usr << "Minor Crimes: [R.fields["mi_crim"]]"
+ usr << "Details: [R.fields["mi_crim_d"]]"
+ usr << "Major Crimes: [R.fields["ma_crim"]]"
+ usr << "Details: [R.fields["ma_crim_d"]]"
+ usr << "Notes: [R.fields["notes"]]"
+ usr << "\[View Comment Log\]"
+ read = 1
+
+ if(!read)
+ usr << "\red Unable to locate a data core entry for this person."
+
+ if (href_list["secrecordComment"])
+ if(hasHUD(usr,"security"))
+ var/perpname = "wot"
+ var/read = 0
+
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.security)
+ if (R.fields["id"] == E.fields["id"])
+ if(hasHUD(usr,"security"))
+ read = 1
+ var/counter = 1
+ while(R.fields[text("com_[]", counter)])
+ usr << text("[]", R.fields[text("com_[]", counter)])
+ counter++
+ if (counter == 1)
+ usr << "No comment found"
+ usr << "\[Add comment\]"
+
+ if(!read)
+ usr << "\red Unable to locate a data core entry for this person."
+
+ if (href_list["secrecordadd"])
+ if(hasHUD(usr,"security"))
+ var/perpname = "wot"
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.security)
+ if (R.fields["id"] == E.fields["id"])
+ if(hasHUD(usr,"security"))
+ var/t1 = copytext(sanitize(input("Add Comment:", "Sec. records", null, null) as message),1,MAX_MESSAGE_LEN)
+ if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
+ return
+ var/counter = 1
+ while(R.fields[text("com_[]", counter)])
+ counter++
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/U = usr
+ R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557
[t1]")
+ if(istype(usr,/mob/living/silicon/robot))
+ var/mob/living/silicon/robot/U = usr
+ R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557
[t1]")
+
+ if (href_list["medical"])
+ if(hasHUD(usr,"medical"))
+ var/perpname = "wot"
+ var/modified = 0
+
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.general)
+ if (R.fields["id"] == E.fields["id"])
+
+ var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*Deceased*", "*Unconscious*", "Physically Unfit", "Active", "Cancel")
+
+ if(hasHUD(usr,"medical"))
+ if(setmedical != "Cancel")
+ R.fields["p_stat"] = setmedical
+ modified = 1
+
+ spawn()
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/U = usr
+ U.handle_regular_hud_updates()
+ if(istype(usr,/mob/living/silicon/robot))
+ var/mob/living/silicon/robot/U = usr
+ U.handle_regular_hud_updates()
+
+ if(!modified)
+ usr << "\red Unable to locate a data core entry for this person."
if (href_list["medrecord"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- var/perpname = "wot"
- var/read = 0
+ if(hasHUD(usr,"medical"))
+ var/perpname = "wot"
+ var/read = 0
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.medical)
- if (R.fields["id"] == E.fields["id"])
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- usr << "Name: [R.fields["name"]] Blood Type: [R.fields["b_type"]]"
- usr << "DNA: [R.fields["b_dna"]]"
- usr << "Minor Disabilities: [R.fields["mi_dis"]]"
- usr << "Details: [R.fields["mi_dis_d"]]"
- usr << "Major Disabilities: [R.fields["ma_dis"]]"
- usr << "Details: [R.fields["ma_dis_d"]]"
- usr << "Notes: [R.fields["notes"]]"
- usr << "\[View Comment Log\]"
- read = 1
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.medical)
+ if (R.fields["id"] == E.fields["id"])
+ if(hasHUD(usr,"medical"))
+ usr << "Name: [R.fields["name"]] Blood Type: [R.fields["b_type"]]"
+ usr << "DNA: [R.fields["b_dna"]]"
+ usr << "Minor Disabilities: [R.fields["mi_dis"]]"
+ usr << "Details: [R.fields["mi_dis_d"]]"
+ usr << "Major Disabilities: [R.fields["ma_dis"]]"
+ usr << "Details: [R.fields["ma_dis_d"]]"
+ usr << "Notes: [R.fields["notes"]]"
+ usr << "\[View Comment Log\]"
+ read = 1
- if(!read)
- usr << "\red Unable to locate a data core entry for this person."
+ if(!read)
+ usr << "\red Unable to locate a data core entry for this person."
if (href_list["medrecordComment"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- var/perpname = "wot"
- var/read = 0
+ if(hasHUD(usr,"medical"))
+ var/perpname = "wot"
+ var/read = 0
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.medical)
- if (R.fields["id"] == E.fields["id"])
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- read = 1
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- usr << text("[]", R.fields[text("com_[]", counter)])
- counter++
- if (counter == 1)
- usr << "No comment found"
- usr << "\[Add comment\]"
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.medical)
+ if (R.fields["id"] == E.fields["id"])
+ if(hasHUD(usr,"medical"))
+ read = 1
+ var/counter = 1
+ while(R.fields[text("com_[]", counter)])
+ usr << text("[]", R.fields[text("com_[]", counter)])
+ counter++
+ if (counter == 1)
+ usr << "No comment found"
+ usr << "\[Add comment\]"
- if(!read)
- usr << "\red Unable to locate a data core entry for this person."
+ if(!read)
+ usr << "\red Unable to locate a data core entry for this person."
if (href_list["medrecordadd"])
- if(istype(usr, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- var/perpname = "wot"
- if(wear_id)
- if(istype(wear_id,/obj/item/weapon/card/id))
- perpname = wear_id:registered_name
- else if(istype(wear_id,/obj/item/device/pda))
- var/obj/item/device/pda/tempPda = wear_id
- perpname = tempPda.owner
- else
- perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.medical)
- if (R.fields["id"] == E.fields["id"])
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
- var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || src.stat || src.restrained() || !(istype(H.glasses, /obj/item/clothing/glasses/hud/health))))
- return
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- counter++
- R.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053
[]",H.get_authentification_name(), H.get_assignment(), time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
+ if(hasHUD(usr,"medical"))
+ var/perpname = "wot"
+ if(wear_id)
+ if(istype(wear_id,/obj/item/weapon/card/id))
+ perpname = wear_id:registered_name
+ else if(istype(wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/tempPda = wear_id
+ perpname = tempPda.owner
+ else
+ perpname = src.name
+ for (var/datum/data/record/E in data_core.general)
+ if (E.fields["name"] == perpname)
+ for (var/datum/data/record/R in data_core.medical)
+ if (R.fields["id"] == E.fields["id"])
+ if(hasHUD(usr,"medical"))
+ var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN)
+ if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
+ return
+ var/counter = 1
+ while(R.fields[text("com_[]", counter)])
+ counter++
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/U = usr
+ R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557
[t1]")
+ if(istype(usr,/mob/living/silicon/robot))
+ var/mob/living/silicon/robot/U = usr
+ R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557
[t1]")
..()
return
@@ -1166,21 +1157,22 @@ mob/living/carbon/human/yank_out_object()
if(O == selection)
affected = organ
if(self)
- src << "You attempt to get a good grip on the [selection] in your [affected] with bloody fingers."
+ src << "You attempt to get a good grip on the [selection] in your [affected.display_name] with bloody fingers."
else
- U << "You attempt to get a good grip on the [selection] in [S]'s [affected] with bloody fingers."
+ U << "You attempt to get a good grip on the [selection] in [S]'s [affected.display_name] with bloody fingers."
if(istype(U,/mob/living/carbon/human/)) U.bloody_hands(S)
if(!do_after(U, 80))
return
- if(!selection || !affected || !S || !U)
- return
+ if(!selection || !affected || !S || !U)
+ return
+
if(self)
- visible_message("[src] rips [selection] out of their [affected] in a welter of blood.","You rip [selection] out of your [affected] in a welter of blood.")
+ visible_message("[src] rips [selection] out of their [affected.display_name] in a welter of blood.","You rip [selection] out of your [affected] in a welter of blood.")
else
- visible_message("[usr] rips [selection] out of [src]'s [affected] in a welter of blood.","[src] rips [selection] out of your [affected] in a welter of blood.")
+ visible_message("[usr] rips [selection] out of [src]'s [affected.display_name] in a welter of blood.","[usr] rips [selection] out of your [affected] in a welter of blood.")
selection.loc = get_turf(src)
affected.implants -= selection
@@ -1226,4 +1218,4 @@ mob/living/carbon/human/yank_out_object()
organ.status |= ORGAN_BLEEDING
organ.take_damage(rand(1,3), 0, 0)
- src.adjustToxLoss(rand(1,3))
+ src.adjustToxLoss(rand(1,3))
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 981cc770ffd..34edb28df43 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -31,6 +31,8 @@ var/list/ai_list = list()
var/icon/holo_icon//Default is assigned when AI is created.
var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/multitool/aiMulti = null
+ var/custom_sprite = 0 //For our custom sprites
+//Hud stuff
//MALFUNCTION
var/datum/AI_Module/module_picker/malf_picker
@@ -125,55 +127,45 @@ var/list/ai_list = list()
set name = "Set AI Core Display"
if(stat || aiRestorePowerRoutine)
return
+ if(!custom_sprite) //Check to see if custom sprite time, checking the appopriate file to change a var
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = text2list(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = text2list(line, "-")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2)
+ continue;
+
+ if(Entry[1] == src.ckey && Entry[2] == src.real_name)
+ custom_sprite = 1 //They're in the list? Custom sprite time
+ icon = 'icons/mob/custom-synthetic.dmi'
//if(icon_state == initial(icon_state))
var/icontype = ""
- var/list/icons = list("Monochrome", "Blue", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static")
- if (src.name == "M00X-BC" && src.ckey == "searif")
- icons += "M00X-BC"
- if (src.name == "Skuld" && src.ckey == "ravensdale")
- icons += "Skuld"
- if (src.name == "REMNANT" && src.ckey == "serithi")
- icons += "REMNANT"
- icontype = input("Please, select a display!", "AI", null/*, null*/) in icons
- if(icontype == "Clown")
- icon_state = "ai-clown2"
- else if(icontype == "Monochrome")
- icon_state = "ai-mono"
- else if(icontype == "Blue")
- icon_state = "ai"
- else if(icontype == "Inverted")
- icon_state = "ai-u"
- else if(icontype == "Firewall")
- icon_state = "ai-magma"
- else if(icontype == "Green")
- icon_state = "ai-wierd"
- else if(icontype == "Red")
- icon_state = "ai-malf"
- else if(icontype == "Static")
- icon_state = "ai-static"
- else if(icontype == "Text")
- icon_state = "ai-text"
- else if(icontype == "Smiley")
- icon_state = "ai-smiley"
- else if(icontype == "Matrix")
- icon_state = "ai-matrix"
- else if(icontype == "Angry")
- icon_state = "ai-angryface"
- else if(icontype == "Dorf")
- icon_state = "ai-dorf"
- else if(icontype == "Bliss")
- icon_state = "ai-bliss"
- else if(icontype == "M00X-BC")
- icon_state = "ai-searif"
- else if(icontype == "Triumvirate")
- icon_state = "ai-triumvirate"
- else if(icontype == "Triumvirate Static")
- icon_state = "ai-triumvirate-malf"
- else if(icontype == "Skuld")
- icon_state = "ai-ravensdale"
- else if(icontype == "REMNANT")
- icon_state = "ai-serithi"
+ if (custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
+ else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static")
+ switch(icontype)
+ if("Custom") icon_state = "[src.ckey]-ai"
+ if("Clown") icon_state = "ai-clown2"
+ if("Monochrome") icon_state = "ai-mono"
+ if("Inverted") icon_state = "ai-u"
+ if("Firewall") icon_state = "ai-magma"
+ if("Green") icon_state = "ai-wierd"
+ if("Red") icon_state = "ai-red"
+ if("Static") icon_state = "ai-static"
+ if("Text") icon_state = "ai-text"
+ if("Smiley") icon_state = "ai-smiley"
+ if("Matrix") icon_state = "ai-matrix"
+ if("Angry") icon_state = "ai-angryface"
+ if("Dorf") icon_state = "ai-dorf"
+ if("Bliss") icon_state = "ai-bliss"
+ if("Triumvirate") icon_state = "ai-triumvirate"
+ if("Triumvirate Static") icon_state = "ai-triumvirate-malf"
+ else icon_state = "ai"
//else
//usr <<"You can only change your display once!"
//return
@@ -188,7 +180,7 @@ var/list/ai_list = list()
if (malf.apcs >= 3)
stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
-
+
/mob/living/silicon/ai/proc/ai_alerts()
set category = "AI Commands"
set name = "Show Alerts"
@@ -337,10 +329,6 @@ var/list/ai_list = list()
else
src << "Unable to locate the holopad."
- if(href_list["say_word"])
- src.announcement(href_list["say_word"])
- return
-
if (href_list["lawc"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
var/L = text2num(href_list["lawc"])
switch(lawcheck[L+1])
@@ -349,6 +337,10 @@ var/list/ai_list = list()
// src << text ("Switching Law [L]'s report status to []", lawcheck[L+1])
checklaws()
+ if(href_list["say_word"])
+ src.announcement(href_list["say_word"])
+ return
+
if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
var/L = text2num(href_list["lawi"])
switch(ioncheck[L])
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 7c054c259fb..6e2fb560b3f 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -1,10 +1,8 @@
/mob/living/silicon/ai/death(gibbed)
if(stat == DEAD) return
stat = DEAD
- if (src.name == "Skuld" && src.ckey == "ravensdale")//checks ID of AI and player to see if it needs to pull the custom death sprite and goes to blue-screen if it doesn't
- icon_state = "ai-ravensdale-crash"
- else if (src.name == "REMNANT" && src.ckey == "serithi")
- icon_state = "ai-serithi-crash"
+ if (src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
+ icon_state = "[ckey]-ai-crash"
else icon_state = "ai-crash"
update_canmove()
if(src.eyeobj)
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index 1d10956582e..e730974401c 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -39,7 +39,7 @@
brute_damage += brute
electronics_damage += electronics
- if(brute_damage + electronics_damage > max_damage) destroy()
+ if(brute_damage + electronics_damage >= max_damage) destroy()
/datum/robot_component/proc/heal_damage(brute, electronics)
if(installed != 1)
@@ -50,7 +50,7 @@
electronics_damage = max(0, electronics_damage - electronics)
/datum/robot_component/proc/is_powered()
- return installed == 1 && (!energy_consumption || powered)
+ return (installed == 1) && (brute_damage + electronics_damage < max_damage) && (!energy_consumption || powered)
/datum/robot_component/proc/consume_power()
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 160b8904daa..c5d18dccd2b 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -66,9 +66,7 @@
else
src.camera.status = 1
- health = 200 - (getOxyLoss() + getFireLoss() + getBruteLoss())
-
- if(getOxyLoss() > 50) Paralyse(3)
+ updatehealth()
if(src.sleeping)
Paralyse(3)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f147d4cc1a3..1f84e124d52 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -10,6 +10,7 @@
var/sight_mode = 0
var/custom_name = ""
var/base_icon
+ var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best
//Hud stuff
@@ -145,7 +146,7 @@
/mob/living/silicon/robot/proc/pick_module()
if(module)
return
- var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service", "Security","Combat")
+ var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security", "Combat")
if(emagged || security_level > SEC_LEVEL_BLUE)
src << "\red Crisis mode active. Combat module available."
modules+="Combat"
@@ -156,7 +157,7 @@
if(module)
return
-
+
switch(mod)
if("Standard")
module = new /obj/item/weapon/robot_module/standard(src)
@@ -177,10 +178,10 @@
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
modtype = "Miner"
- channels = list("Mining" = 1)
+ channels = list("Supply" = 1)
module_sprites["Basic"] = "Miner_old"
module_sprites["Advanced Droid"] = "droid-miner"
- module_sprites["Default"] = "Miner"
+ module_sprites["Treadhead"] = "Miner"
if("Medical")
module = new /obj/item/weapon/robot_module/medical(src)
@@ -221,18 +222,10 @@
module_sprites["Combat Android"] = "droid-combat"
channels = list("Security" = 1)
- //Begin awful custom item checks.
- if (src.name == "Lucy" && src.ckey == "rowtree")
- switch(mod)
- if("Medical")
- module_sprites["Lucy"] = "rowtree-medical"
- if("Security" || "Combat")
- module_sprites["Lucy"] = "rowtree-security"
- if("Engineering")
- module_sprites["Lucy"] = "rowtree-engineering"
- else
- module_sprites["Lucy"] = "rowtree-lucy"
-
+ //Custom_sprite check and entry
+ if (custom_sprite == 1)
+ module_sprites["Custom"] = "[src.ckey]-[mod]"
+
hands.icon_state = lowertext(mod)
feedback_inc("cyborg_[lowertext(mod)]",1)
updatename(mod)
@@ -265,6 +258,23 @@
//We also need to update name of internal camera.
if (camera)
camera.c_tag = changed_name
+
+ if(!custom_sprite) //Check for custom sprite
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = text2list(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = text2list(line, "-")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2)
+ continue;
+
+ if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
+ custom_sprite = 1
+ icon = 'icons/mob/custom-synthetic.dmi'
/mob/living/silicon/robot/verb/Namepick()
if(custom_name)
@@ -979,6 +989,14 @@
overlays += "eyes-[icon_state]"
else
overlays -= "eyes"
+
+ if(opened && custom_sprite == 1) //Custom borgs also have custom panels, heh
+ if(wiresexposed)
+ overlays += "[src.ckey]-openpanel +w"
+ else if(cell)
+ overlays += "[src.ckey]-openpanel +c"
+ else
+ overlays += "[src.ckey]-openpanel -c"
if(opened)
if(wiresexposed)
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index 49dcf7248ec..632b39e9f6f 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -3,21 +3,21 @@
health = 100
stat = CONSCIOUS
return
- health = 100 - getBruteLoss() - getFireLoss()
+ health = 100 - (getBruteLoss() + getFireLoss())
return
/mob/living/silicon/robot/getBruteLoss()
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
- if(C.installed == 1) amount += C.brute_damage
+ if(C.installed != 0) amount += C.brute_damage
return amount
/mob/living/silicon/robot/getFireLoss()
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
- if(C.installed == 1) amount += C.electronics_damage
+ if(C.installed != 0) amount += C.electronics_damage
return amount
/mob/living/silicon/robot/adjustBruteLoss(var/amount)
@@ -52,16 +52,31 @@
if(!parts.len) return
var/datum/robot_component/picked = pick(parts)
picked.heal_damage(brute,burn)
- updatehealth()
-/mob/living/silicon/robot/take_organ_damage(var/brute, var/burn, var/sharp = 0)
+/mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/sharp = 0)
var/list/components = get_damageable_components()
- if(components.len)
+ if(!components.len)
return
+ //Combat shielding absorbs a percentage of damage directly into the cell.
+ if(module_active && istype(module_active,/obj/item/borg/combat/shield))
+ var/obj/item/borg/combat/shield/shield = module_active
+ //Shields absorb a certain percentage of damage based on their power setting.
+ var/absorb_brute = brute*shield.shield_level
+ var/absorb_burn = burn*shield.shield_level
+ var/cost = (absorb_brute+absorb_burn)*100
+
+ cell.charge -= cost
+ if(cell.charge <= 0)
+ cell.charge = 0
+ src << "\red Your shield has overloaded!"
+ else
+ brute -= absorb_brute
+ burn -= absorb_burn
+ src << "\red Your shield absorbs some of the impact!"
+
var/datum/robot_component/C = pick(components)
C.take_damage(brute,burn,sharp)
- updatehealth()
/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn)
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
@@ -78,7 +93,6 @@
burn -= (burn_was-picked.electronics_damage)
parts -= picked
- updatehealth()
/mob/living/silicon/robot/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null)
if(status_flags & GODMODE) return //godmode
@@ -112,6 +126,4 @@
brute -= (picked.brute_damage - brute_was)
burn -= (picked.electronics_damage - burn_was)
- parts -= picked
-
- updatehealth()
+ parts -= picked
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index a11401c6680..1597a3cd545 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -946,7 +946,7 @@ mob/verb/yank_out_object()
if(self)
visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.")
else
- visible_message("[usr] rips [selection] out of [src]'s body.","[src] rips [selection] out of your body.")
+ visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.")
selection.loc = get_turf(src)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 5e7c613004f..bb81a5ca4e7 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -269,6 +269,14 @@
proc/AttemptLateSpawn(rank)
+ if (src != usr)
+ return 0
+ if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
+ usr << "\red The round is either not ready, or has already finished..."
+ return 0
+ if(!enter_allowed)
+ usr << "\blue There is an administrative lock on entering the game!"
+ return 0
if(!IsJobAvailable(rank))
src << alert("[rank] is not available. Please try another.")
return 0
diff --git a/config/config.txt b/config/config.txt
index 3f03dbec505..82bf3f188f8 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -211,12 +211,10 @@ NUDGE_SCRIPT_PATH nudge.py
## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player.
ALIEN_PLAYER_RATIO 0.2
-##Remove the # to let ghosts spin chairs
-#GHOST_INTERACTION
-
+##Remove the # to let ghosts spin chairs
## Uncomment this to enable external .rsc downloads. URLs must be separated by no more than one space.
## The linked .zip file should contain the required .rsc
-#resource_urls http://firstserver.org/myresource.zip http://secondserver.org/myresource.zip http://10.22.11.1/myresource.zip
+#resource_urls http://firstserver.org/myresource.zip http://secondserver.org/myresource.zip http://10.22.11.1/myresource.zip
## Uncomment to enable sending data to the IRC bot.
#USE_IRC_BOT
diff --git a/config/custom_sprites.txt b/config/custom_sprites.txt
new file mode 100644
index 00000000000..d9b0adfeca7
--- /dev/null
+++ b/config/custom_sprites.txt
@@ -0,0 +1,6 @@
+rowtree-Lucy
+sydrec-SINA
+mordeth221-Elly
+ravensdale-Blunt
+ravensdale-Skuld
+serithi-REMNANT
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index f79db2c571d..83de3037b73 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -57,6 +57,13 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. -->
+
+
03.07.2013
+
Segrain updated:
+
+ - Security and medical cyborgs can use their HUDs to access records.
+
+
June 28th, 2013
Segrain updated:
@@ -85,14 +92,17 @@ should be listed in the changelog upon commit though. Thanks. -->
A few space ninja titles/names have been added and removed to be slightly more believable
The antagonist selector no longer chooses jobbanned players when it runs out of willing options
-
+
+
June 26th, 2013
Segrain updated:
- Autopsy scanner properly displays time of wound infliction and death.
- Autopsy scanner properly displays wounds by projectile weapons.
-
June 23rd, 2013
+
+
+
June 23rd, 2013
Segrain updated:
- Airlocks of various models can be constructed again.
@@ -107,11 +117,6 @@ should be listed in the changelog upon commit though. Thanks. -->
- Some maintenance doors within RnD and Medbay have had their accesses changed. Maintenance doors in the joint areas (leading to the research shuttle, virology, and xenobiology) are now zero access. Which means anyone in those joints can enter the maintenance tunnels. This was done to add additional evacuation locations during radiation storms. Additional maintenance doors were added to the tunnels in these areas to prevent docs and scientists from running about.
- Starboard emergency storage isn't gone now, it's simply located in the escape wing.
- An engineering training room has been added to engineering. This location was previously where surgery was located. If you are new to engineering or need to brush up on your skills, please use this area for testing.
- 26.06.2013
- Segrain updated:
-
- - Autopsy scanner properly displays time of wound infliction and death.
- - Autopsy scanner properly displays wounds by projectile weapons.
diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi
index e15a7038f9a..d3a4bf4d53b 100644
Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
new file mode 100644
index 00000000000..d32659f6d6d
Binary files /dev/null and b/icons/mob/custom-synthetic.dmi differ
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 10260ef5718..1735fd8b3f0 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ