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

Conflicts:
	code/game/objects/items/stacks/tiles/plasteel.dm
	code/game/objects/items/stacks/tiles/tile_types.dm
	code/modules/materials/materials.dm
	code/modules/mob/living/carbon/human/life.dm
	code/modules/mob/living/silicon/pai/pai.dm
	code/modules/surgery/implant.dm
	code/setup.dm
This commit is contained in:
PsiOmega
2015-06-26 20:28:47 +02:00
41 changed files with 290 additions and 149 deletions

View File

@@ -114,10 +114,10 @@
ReplaceWithLattice() ReplaceWithLattice()
return return
if (istype(C, /obj/item/stack/tile/plasteel)) if (istype(C, /obj/item/stack/tile/steel))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L) if(L)
var/obj/item/stack/tile/plasteel/S = C var/obj/item/stack/tile/steel/S = C
if (S.get_amount() < 1) if (S.get_amount() < 1)
return return
qdel(L) qdel(L)

View File

@@ -226,14 +226,15 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//Returns the firelevel //Returns the firelevel
/datum/gas_mixture/proc/zburn(zone/zone, force_burn, no_check = 0) /datum/gas_mixture/proc/zburn(zone/zone, force_burn, no_check = 0)
#ifdef FIREDBG
log_debug("***************** FIREDBG *****************")
if(zone) log_debug("Burning [zone.name]!")
#endif
. = 0 . = 0
if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null))) if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null)))
var/gas_fuel = 0 //in the case of mixed gas/liquid fires, the gas burns first.
#ifdef FIREDBG
log_debug("***************** FIREDBG *****************")
log_debug("Burning [zone? zone.name : "zoneless gas_mixture"]!")
#endif
var/gas_fuel = 0
var/liquid_fuel = 0 var/liquid_fuel = 0
var/total_fuel = 0 var/total_fuel = 0
var/total_oxidizers = 0 var/total_oxidizers = 0
@@ -269,23 +270,27 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//calculate the firelevel. //calculate the firelevel.
var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit) var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit)
var/firelevel_ratio = firelevel / vsc.fire_firelevel_multiplier
//vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).)
//vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn). var/min_burn = 0.30*volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast
var/gas_reaction_progress = min(0.2, (firelevel/vsc.fire_firelevel_multiplier))*gas_fuel*FIRE_GAS_BURNRATE_MULT var/gas_reaction_progress = max(min_burn, firelevel_ratio*gas_fuel)*FIRE_GAS_BURNRATE_MULT
//liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area. //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area.
var/liquid_reaction_progress = ((firelevel/vsc.fire_firelevel_multiplier)*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT var/liquid_reaction_progress = (firelevel_ratio*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT
var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress
var/used_fuel = min(total_reaction_progress, reaction_limit) var/used_fuel = min(total_reaction_progress, reaction_limit)
var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT)
#ifdef FIREDBG #ifdef FIREDBG
log_debug("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]")
log_debug("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]")
log_debug("firelevel -> [firelevel] / [vsc.fire_firelevel_multiplier]") log_debug("firelevel -> [firelevel] / [vsc.fire_firelevel_multiplier]")
log_debug("liquid_reaction_progress = [liquid_reaction_progress]") log_debug("liquid_reaction_progress = [liquid_reaction_progress]")
log_debug("gas_reaction_progress = [gas_reaction_progress]") log_debug("gas_reaction_progress = [gas_reaction_progress]")
log_debug("used_fuel = [used_fuel]; used_oxidizers = [used_oxidizers]; reaction_limit=[reaction_limit]") log_debug("total_reaction_progress = [total_reaction_progress]")
log_debug("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ")
#endif #endif
//if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out //if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out
@@ -297,8 +302,8 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//*** Remove fuel and oxidizer, add carbon dioxide and heat //*** Remove fuel and oxidizer, add carbon dioxide and heat
//remove and add gasses as calculated //remove and add gasses as calculated
var/used_gas_fuel = between(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress), gas_fuel) //remove in proportion to the relative reaction progress var/used_gas_fuel = min(max(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress)), gas_fuel) //remove in proportion to the relative reaction progress
var/used_liquid_fuel = between(0.25, used_fuel-used_gas_fuel, liquid_fuel) var/used_liquid_fuel = min(max(0.25, used_fuel-used_gas_fuel), liquid_fuel)
//remove_by_flag() and adjust_gas() handle the group_multiplier for us. //remove_by_flag() and adjust_gas() handle the group_multiplier for us.
remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers) remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers)
@@ -309,10 +314,10 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
zone.remove_liquidfuel(used_liquid_fuel, !check_combustability()) zone.remove_liquidfuel(used_liquid_fuel, !check_combustability())
//calculate the energy produced by the reaction and then set the new temperature of the mix //calculate the energy produced by the reaction and then set the new temperature of the mix
temperature = (starting_energy + vsc.fire_fuel_energy_release * used_fuel) / heat_capacity() temperature = (starting_energy + vsc.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / heat_capacity()
#ifdef FIREDBG #ifdef FIREDBG
log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_gas_fuel+used_liquid_fuel]") log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]")
log_debug("new temperature = [temperature]") log_debug("new temperature = [temperature]")
#endif #endif
@@ -353,7 +358,7 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
. = 0 . = 0
for(var/g in gas) for(var/g in gas)
if(gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.1) if(gas_data.flags[g] & XGM_GAS_FUEL && QUANTIZE(gas[g] * vsc.fire_consuption_rate) >= 0.005)
. = 1 . = 1
break break

View File

@@ -297,7 +297,7 @@ var/global/datum/controller/radio/radio_controller
devices_line -= null devices_line -= null
if (devices_line.len==0) if (devices_line.len==0)
devices -= devices_filter devices -= devices_filter
qdel(devices_line) del(devices_line)
/datum/signal /datum/signal
var/obj/source var/obj/source

View File

@@ -20,7 +20,7 @@
for(var/obj/machinery/power/apc/C in world) for(var/obj/machinery/power/apc/C in world)
if(C.cell && C.z in config.station_levels) if(!C.is_critical && C.cell && (C.z in config.station_levels))
C.cell.charge = 0 C.cell.charge = 0
/proc/power_restore(var/announce = 1) /proc/power_restore(var/announce = 1)
@@ -29,7 +29,7 @@
if(announce) if(announce)
command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in world) for(var/obj/machinery/power/apc/C in world)
if(C.cell && C.z in config.station_levels) if(C.cell && (C.z in config.station_levels))
C.cell.charge = C.cell.maxcharge C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in world) for(var/obj/machinery/power/smes/S in world)
var/area/current_area = get_area(S) var/area/current_area = get_area(S)

View File

@@ -399,7 +399,7 @@
imp += "[I] implanted:" imp += "[I] implanted:"
else else
unknown_body++ unknown_body++
if(unknown_body || e.hidden) if(unknown_body)
imp += "Unknown body present:" imp += "Unknown body present:"
if(!AN && !open && !infected & !imp) if(!AN && !open && !infected & !imp)

View File

@@ -10,7 +10,7 @@
var/list/mode = list("dismantle"=0,"laying"=0,"collect"=0) var/list/mode = list("dismantle"=0,"laying"=0,"collect"=0)
/obj/machinery/floorlayer/New() /obj/machinery/floorlayer/New()
T = new/obj/item/stack/tile/plasteel(src) T = new/obj/item/stack/tile/steel(src)
..() ..()
/obj/machinery/floorlayer/Move(new_turf,M_Dir) /obj/machinery/floorlayer/Move(new_turf,M_Dir)

View File

@@ -13,6 +13,7 @@ obj/machinery/recharger
var/icon_state_charged = "recharger2" var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1" var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered var/icon_state_idle = "recharger0" //also when unpowered
var/portable = 1
obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
if(istype(user,/mob/living/silicon)) if(istype(user,/mob/living/silicon))
@@ -45,7 +46,7 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
G.loc = src G.loc = src
charging = G charging = G
update_icon() update_icon()
else if(istype(G, /obj/item/weapon/wrench)) else if(portable && istype(G, /obj/item/weapon/wrench))
if(charging) if(charging)
user << "<span class='warning'>Remove [charging] first!</span>" user << "<span class='warning'>Remove [charging] first!</span>"
return return
@@ -155,3 +156,4 @@ obj/machinery/recharger/wallcharger
icon_state_charged = "wrecharger2" icon_state_charged = "wrecharger2"
icon_state_charging = "wrecharger1" icon_state_charging = "wrecharger1"
icon_state_idle = "wrecharger0" icon_state_idle = "wrecharger0"
portable = 0

View File

@@ -254,7 +254,7 @@ Alien plants should do something if theres a lot of poison
/obj/effect/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) /obj/effect/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300) if(exposed_temperature > 300 + T0C)
health -= 5 health -= 5
healthcheck() healthcheck()
@@ -425,7 +425,7 @@ Alien plants should do something if theres a lot of poison
Burst() Burst()
/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) /obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 500) if(exposed_temperature > 500 + T0C)
health -= 5 health -= 5
healthcheck() healthcheck()

View File

@@ -48,7 +48,7 @@
qdel(src) qdel(src)
/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) /obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300) if(exposed_temperature > 300 + T0C)
health -= 5 health -= 5
healthcheck() healthcheck()

View File

@@ -21,7 +21,7 @@
if(istype(A, /turf/simulated/floor)) if(istype(A, /turf/simulated/floor))
var/turf/simulated/floor/F = A var/turf/simulated/floor/F = A
if(F.is_plasteel_floor()) // only tiled floors if(F.is_steel_floor()) // only tiled floors
if(tile_dir_mode) if(tile_dir_mode)
var/D = get_dir(usr, F) var/D = get_dir(usr, F)
if(usr.loc == F) if(usr.loc == F)

View File

@@ -1,7 +1,7 @@
/obj/item/stack/tile/plasteel /obj/item/stack/tile/steel
name = "floor tile" name = "floor tile"
singular_name = "floor tile" singular_name = "floor tile"
desc = "Those could work as a pretty decent throwing weapon" desc = "Those could work as a pretty decent throwing weapon" //why?
icon_state = "tile" icon_state = "tile"
force = 6.0 force = 6.0
matter = list(DEFAULT_WALL_MATERIAL = 937.5) matter = list(DEFAULT_WALL_MATERIAL = 937.5)
@@ -10,23 +10,23 @@
throw_range = 20 throw_range = 20
flags = CONDUCT flags = CONDUCT
/obj/item/stack/tile/plasteel/New(var/loc, var/amount=null) /obj/item/stack/tile/steel/New(var/loc, var/amount=null)
..() ..()
src.pixel_x = rand(1, 14) src.pixel_x = rand(1, 14)
src.pixel_y = rand(1, 14) src.pixel_y = rand(1, 14)
return return
/obj/item/stack/tile/plasteel/cyborg /obj/item/stack/tile/steel/cyborg
name = "floor tile synthesizer" name = "floor tile synthesizer"
desc = "A device that makes floor tiles." desc = "A device that makes floor tiles."
gender = NEUTER gender = NEUTER
matter = null matter = null
uses_charge = 1 uses_charge = 1
charge_costs = list(250) charge_costs = list(250)
stacktype = /obj/item/stack/tile/plasteel stacktype = /obj/item/stack/tile/steel
build_type = /obj/item/stack/tile/plasteel build_type = /obj/item/stack/tile/steel
/obj/item/stack/tile/plasteel/proc/build(turf/S as turf) /obj/item/stack/tile/steel/proc/build(turf/S as turf)
if (istype(S,/turf/space)) if (istype(S,/turf/space))
S.ChangeTurf(/turf/simulated/floor/plating/airless) S.ChangeTurf(/turf/simulated/floor/plating/airless)
else else

View File

@@ -26,7 +26,7 @@
throwforce = 1.0 throwforce = 1.0
throw_speed = 5 throw_speed = 5
throw_range = 20 throw_range = 20
flags = CONDUCT flags = 0
origin_tech = list(TECH_BIO = 1) origin_tech = list(TECH_BIO = 1)
/* /*
@@ -41,7 +41,7 @@
throwforce = 1.0 throwforce = 1.0
throw_speed = 5 throw_speed = 5
throw_range = 20 throw_range = 20
flags = CONDUCT flags = 0
/obj/item/stack/tile/wood/cyborg /obj/item/stack/tile/wood/cyborg
name = "wood floor tile synthesizer" name = "wood floor tile synthesizer"
@@ -63,4 +63,4 @@
throwforce = 1.0 throwforce = 1.0
throw_speed = 5 throw_speed = 5
throw_range = 20 throw_range = 20
flags = CONDUCT flags = 0

View File

@@ -53,7 +53,7 @@
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob) /obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob)
if (istype(C, /obj/item/stack/tile/plasteel)) if (istype(C, /obj/item/stack/tile/steel))
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
return return

View File

@@ -29,7 +29,7 @@ var/list/wood_icons = list("wood","wood-broken")
/turf/simulated/floor /turf/simulated/floor
//Note to coders, the 'intact' var can no longer be used to determine if the floor is a plating or not. //Note to coders, the 'intact' var can no longer be used to determine if the floor is a plating or not.
//Use the is_plating(), is_plasteel_floor() and is_light_floor() procs instead. --Errorage //Use the is_plating(), is_steel_floor() and is_light_floor() procs instead. --Errorage
name = "floor" name = "floor"
icon = 'icons/turf/floors.dmi' icon = 'icons/turf/floors.dmi'
icon_state = "floor" icon_state = "floor"
@@ -42,7 +42,7 @@ var/list/wood_icons = list("wood","wood-broken")
var/broken = 0 var/broken = 0
var/burnt = 0 var/burnt = 0
var/mineral = DEFAULT_WALL_MATERIAL var/mineral = DEFAULT_WALL_MATERIAL
var/floor_type = /obj/item/stack/tile/plasteel var/floor_type = /obj/item/stack/tile/steel
var/lightfloor_state // for light floors, this is the state of the tile. 0-7, 0x4 is on-bit - use the helper procs below var/lightfloor_state // for light floors, this is the state of the tile. 0-7, 0x4 is on-bit - use the helper procs below
proc/get_lightfloor_state() proc/get_lightfloor_state()
@@ -102,13 +102,23 @@ var/list/wood_icons = list("wood","wood-broken")
return return
/turf/simulated/floor/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) /turf/simulated/floor/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
var/temp_destroy = get_damage_temperature()
if(!burnt && prob(5)) if(!burnt && prob(5))
burn_tile() burn_tile(exposed_temperature)
else if(prob(1) && !is_plating()) else if(temp_destroy && exposed_temperature >= (temp_destroy + 100) && prob(1) && !is_plating())
make_plating() make_plating() //destroy the tile, exposing plating
burn_tile() burn_tile(exposed_temperature)
return return
//should be a little bit lower than the temperature required to destroy the material
/turf/simulated/floor/proc/get_damage_temperature()
if(is_steel_floor()) return T0C+1400
if(is_wood_floor()) return T0C+200
if(is_carpet_floor()) return T0C+200
if(is_grass_floor()) return T0C+80
return null
/turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) /turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume)
var/dir_to = get_dir(src, adj_turf) var/dir_to = get_dir(src, adj_turf)
@@ -122,7 +132,7 @@ var/list/wood_icons = list("wood","wood-broken")
turf/simulated/floor/proc/update_icon() turf/simulated/floor/proc/update_icon()
if(lava) if(lava)
return return
else if(is_plasteel_floor()) else if(is_steel_floor())
if(!broken && !burnt) if(!broken && !burnt)
icon_state = icon_regular_floor icon_state = icon_regular_floor
else if(is_plating()) else if(is_plating())
@@ -237,8 +247,8 @@ turf/simulated/floor/proc/update_icon()
make_plating() make_plating()
break_tile() break_tile()
/turf/simulated/floor/is_plasteel_floor() /turf/simulated/floor/is_steel_floor()
if(ispath(floor_type, /obj/item/stack/tile/plasteel)) if(ispath(floor_type, /obj/item/stack/tile/steel))
return 1 return 1
else else
return 0 return 0
@@ -277,7 +287,7 @@ turf/simulated/floor/proc/update_icon()
if(istype(src,/turf/simulated/floor/mech_bay_recharge_floor)) if(istype(src,/turf/simulated/floor/mech_bay_recharge_floor))
src.ChangeTurf(/turf/simulated/floor/plating) src.ChangeTurf(/turf/simulated/floor/plating)
if(broken) return if(broken) return
if(is_plasteel_floor()) if(is_steel_floor())
src.icon_state = "damaged[pick(1,2,3,4,5)]" src.icon_state = "damaged[pick(1,2,3,4,5)]"
broken = 1 broken = 1
else if(is_light_floor()) else if(is_light_floor())
@@ -296,28 +306,38 @@ turf/simulated/floor/proc/update_icon()
src.icon_state = "sand[pick("1","2","3")]" src.icon_state = "sand[pick("1","2","3")]"
broken = 1 broken = 1
/turf/simulated/floor/proc/burn_tile() /turf/simulated/floor/proc/burn_tile(var/exposed_temperature)
if(istype(src,/turf/simulated/floor/engine)) return if(istype(src,/turf/simulated/floor/engine)) return
if(istype(src,/turf/simulated/floor/plating/airless/asteroid)) return//Asteroid tiles don't burn if(istype(src,/turf/simulated/floor/plating/airless/asteroid)) return//Asteroid tiles don't burn
if(broken || burnt) return
if(is_plasteel_floor()) var/damage_temp = get_damage_temperature()
src.icon_state = "damaged[pick(1,2,3,4,5)]"
burnt = 1 if(broken) return
else if(is_plasteel_floor()) if(burnt)
if(is_steel_floor() && exposed_temperature >= damage_temp) //allow upgrading from scorched tiles to damaged tiles
src.icon_state = "damaged[pick(1,2,3,4,5)]"
broken = 1
return
if(is_steel_floor() && exposed_temperature >= T0C+300) //enough to char the floor, but not hot enough to actually burn holes in it
src.icon_state = "floorscorched[pick(1,2)]" src.icon_state = "floorscorched[pick(1,2)]"
burnt = 1 burnt = 1
else if(is_plating()) else if(exposed_temperature >= damage_temp)
src.icon_state = "panelscorched" if(is_steel_floor())
burnt = 1 src.icon_state = "damaged[pick(1,2,3,4,5)]"
else if(is_wood_floor()) burnt = 1
src.icon_state = "wood-broken" else if(is_plating())
burnt = 1 src.icon_state = "panelscorched"
else if(is_carpet_floor()) burnt = 1
src.icon_state = "carpet-broken" else if(is_wood_floor())
burnt = 1 src.icon_state = "wood-broken"
else if(is_grass_floor()) burnt = 1
src.icon_state = "sand[pick("1","2","3")]" else if(is_carpet_floor())
burnt = 1 src.icon_state = "carpet-broken"
burnt = 1
else if(is_grass_floor())
src.icon_state = "sand[pick("1","2","3")]"
burnt = 1
//This proc will set floor_type to null and the update_icon() proc will then change the icon_state of the turf //This proc will set floor_type to null and the update_icon() proc will then change the icon_state of the turf
//This proc auto corrects the grass tiles' siding. //This proc auto corrects the grass tiles' siding.
@@ -351,13 +371,13 @@ turf/simulated/floor/proc/update_icon()
//This proc will make the turf a plasteel floor tile. The expected argument is the tile to make the turf with //This proc will make the turf a plasteel floor tile. The expected argument is the tile to make the turf with
//If none is given it will make a new object. dropping or unequipping must be handled before or after calling //If none is given it will make a new object. dropping or unequipping must be handled before or after calling
//this proc. //this proc.
/turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/plasteel/T = null) /turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/steel/T = null)
broken = 0 broken = 0
burnt = 0 burnt = 0
intact = 1 intact = 1
set_light(0) set_light(0)
if(T) if(T)
if(istype(T,/obj/item/stack/tile/plasteel)) if(istype(T,/obj/item/stack/tile/steel))
floor_type = T.type floor_type = T.type
if (icon_regular_floor) if (icon_regular_floor)
icon_state = icon_regular_floor icon_state = icon_regular_floor
@@ -368,7 +388,7 @@ turf/simulated/floor/proc/update_icon()
levelupdate() levelupdate()
return return
//if you gave a valid parameter, it won't get thisf ar. //if you gave a valid parameter, it won't get thisf ar.
floor_type = /obj/item/stack/tile/plasteel floor_type = /obj/item/stack/tile/steel
icon_state = "floor" icon_state = "floor"
icon_regular_floor = icon_state icon_regular_floor = icon_state

View File

@@ -35,10 +35,10 @@
ReplaceWithLattice() ReplaceWithLattice()
return return
if (istype(C, /obj/item/stack/tile/plasteel)) if (istype(C, /obj/item/stack/tile/steel))
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
if(L) if(L)
var/obj/item/stack/tile/plasteel/S = C var/obj/item/stack/tile/steel/S = C
if (S.get_amount() < 1) if (S.get_amount() < 1)
return return
qdel(L) qdel(L)

View File

@@ -2,7 +2,7 @@
icon = 'icons/turf/floors.dmi' icon = 'icons/turf/floors.dmi'
level = 1.0 level = 1.0
//for floors, use is_plating(), is_plasteel_floor() and is_light_floor() //for floors, use is_plating(), is_steel_floor() and is_light_floor()
var/intact = 1 var/intact = 1
//Properties for open tiles (/floor) //Properties for open tiles (/floor)
@@ -156,7 +156,7 @@
return 0 return 0
/turf/proc/is_asteroid_floor() /turf/proc/is_asteroid_floor()
return 0 return 0
/turf/proc/is_plasteel_floor() /turf/proc/is_steel_floor()
return 0 return 0
/turf/proc/is_light_floor() /turf/proc/is_light_floor()
return 0 return 0

View File

@@ -641,13 +641,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack)
if ("pirate") if ("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)

View File

@@ -178,6 +178,25 @@
return ..() return ..()
// here because it's similar to below
// Returns null if no DB connection can be established, or -1 if the requested key was not found in the database
/proc/get_player_age(key)
establish_db_connection()
if(!dbcon.IsConnected())
return null
var/sql_ckey = sql_sanitize_text(ckey(key))
var/DBQuery/query = dbcon.NewQuery("SELECT datediff(Now(),firstseen) as age FROM erro_player WHERE ckey = '[sql_ckey]'")
query.Execute()
if(query.NextRow())
return text2num(query.item[1])
else
return -1
/client/proc/log_client_to_db() /client/proc/log_client_to_db()

View File

@@ -141,21 +141,18 @@
desc = "A pair of kitty ears. Meow!" desc = "A pair of kitty ears. Meow!"
icon_state = "kitty" icon_state = "kitty"
body_parts_covered = 0 body_parts_covered = 0
var/icon/mob
var/icon/mob2
siemens_coefficient = 1.5 siemens_coefficient = 1.5
item_icons = list()
update_icon(var/mob/living/carbon/human/user) update_icon(var/mob/living/carbon/human/user)
if(!istype(user)) return if(!istype(user)) return
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty") var/icon/ears = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2") ears.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
var/icon/earbit2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner2") ears.Blend(earbit, ICON_OVERLAY)
mob.Blend(earbit, ICON_OVERLAY)
mob2.Blend(earbit2, ICON_OVERLAY) item_icons[icon_head] = ears
/obj/item/clothing/head/richard /obj/item/clothing/head/richard
name = "chicken mask" name = "chicken mask"

View File

@@ -46,7 +46,7 @@
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0) recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20) recipes += new/datum/stack_recipe("floor tile", /obj/item/stack/tile/steel, 1, 4, 20)
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60) recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60)
recipes += new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1)

View File

@@ -68,7 +68,7 @@ var/list/name_to_material
// Attributes // Attributes
var/cut_delay = 0 // Delay in ticks when cutting through this wall. var/cut_delay = 0 // Delay in ticks when cutting through this wall.
var/radioactivity // Radiation var. Used in wall and object processing to irradiate surroundings. var/radioactivity // Radiation var. Used in wall and object processing to irradiate surroundings.
var/ignition_point // Point at which the material catches on fire. var/ignition_point // K, point at which the material catches on fire.
var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this
var/integrity = 150 // General-use HP value for products. var/integrity = 150 // General-use HP value for products.
var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors. var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors.
@@ -247,7 +247,7 @@ var/list/name_to_material
/material/phoron /material/phoron
name = "phoron" name = "phoron"
stack_type = /obj/item/stack/material/phoron stack_type = /obj/item/stack/material/phoron
ignition_point = 100 ignition_point = PHORON_MINIMUM_BURN_TEMPERATURE
icon_base = "stone" icon_base = "stone"
icon_colour = "#FC2BC5" icon_colour = "#FC2BC5"
shard_type = SHARD_SHARD shard_type = SHARD_SHARD
@@ -430,7 +430,7 @@ var/list/name_to_material
name = "phoron glass" name = "phoron glass"
stack_type = /obj/item/stack/material/glass/phoronglass stack_type = /obj/item/stack/material/glass/phoronglass
flags = MATERIAL_BRITTLE flags = MATERIAL_BRITTLE
ignition_point = 300 ignition_point = PHORON_MINIMUM_BURN_TEMPERATURE+300
integrity = 200 // idk why but phoron windows are strong, so. integrity = 200 // idk why but phoron windows are strong, so.
icon_colour = "#FC2BC5" icon_colour = "#FC2BC5"
stack_origin_tech = list(TECH_MATERIAL = 3, TECH_PHORON = 2) stack_origin_tech = list(TECH_MATERIAL = 3, TECH_PHORON = 2)
@@ -459,6 +459,7 @@ var/list/name_to_material
icon_colour = "#CCCCCC" icon_colour = "#CCCCCC"
hardness = 10 hardness = 10
weight = 12 weight = 12
melting_point = T0C+371 //assuming heat resistant plastic
stack_origin_tech = list(TECH_MATERIAL = 3) stack_origin_tech = list(TECH_MATERIAL = 3)
/material/plastic/holographic /material/plastic/holographic
@@ -521,6 +522,8 @@ var/list/name_to_material
shard_can_repair = 0 // you can't weld splinters back into planks shard_can_repair = 0 // you can't weld splinters back into planks
hardness = 15 hardness = 15
weight = 18 weight = 18
melting_point = T0C+300 //okay, not melting in this case, but hot enough to destroy wood
ignition_point = T0C+288
stack_origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) stack_origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
dooropen_noise = 'sound/effects/doorcreaky.ogg' dooropen_noise = 'sound/effects/doorcreaky.ogg'
door_icon_base = "wood" door_icon_base = "wood"
@@ -542,6 +545,8 @@ var/list/name_to_material
icon_colour = "#AAAAAA" icon_colour = "#AAAAAA"
hardness = 1 hardness = 1
weight = 1 weight = 1
ignition_point = T0C+232 //"the temperature at which book-paper catches fire, and burns." close enough
melting_point = T0C+232 //temperature at which cardboard walls would be destroyed
stack_origin_tech = list(TECH_MATERIAL = 1) stack_origin_tech = list(TECH_MATERIAL = 1)
door_icon_base = "wood" door_icon_base = "wood"
destruction_desc = "crumples" destruction_desc = "crumples"
@@ -550,6 +555,8 @@ var/list/name_to_material
name = "cloth" name = "cloth"
stack_origin_tech = list(TECH_MATERIAL = 2) stack_origin_tech = list(TECH_MATERIAL = 2)
door_icon_base = "wood" door_icon_base = "wood"
ignition_point = T0C+232
melting_point = T0C+300
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
/material/cult /material/cult
@@ -578,6 +585,7 @@ var/list/name_to_material
icon_colour = "#E85DD8" icon_colour = "#E85DD8"
dooropen_noise = 'sound/effects/attackblob.ogg' dooropen_noise = 'sound/effects/attackblob.ogg'
door_icon_base = "resin" door_icon_base = "resin"
melting_point = T0C+300
/material/resin/can_open_material_door(var/mob/living/user) /material/resin/can_open_material_door(var/mob/living/user)
var/mob/living/carbon/M = user var/mob/living/carbon/M = user
@@ -591,6 +599,8 @@ var/list/name_to_material
icon_colour = "#5C4831" icon_colour = "#5C4831"
stack_origin_tech = list(TECH_MATERIAL = 2) stack_origin_tech = list(TECH_MATERIAL = 2)
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+300
melting_point = T0C+300
/material/carpet /material/carpet
name = "carpet" name = "carpet"
@@ -598,12 +608,16 @@ var/list/name_to_material
use_name = "red upholstery" use_name = "red upholstery"
icon_colour = "#DA020A" icon_colour = "#DA020A"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cotton /material/cotton
name = "cotton" name = "cotton"
display_name ="cotton" display_name ="cotton"
icon_colour = "#FFFFFF" icon_colour = "#FFFFFF"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_teal /material/cloth_teal
name = "teal" name = "teal"
@@ -611,6 +625,8 @@ var/list/name_to_material
use_name = "teal cloth" use_name = "teal cloth"
icon_colour = "#00EAFA" icon_colour = "#00EAFA"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_black /material/cloth_black
name = "black" name = "black"
@@ -618,6 +634,8 @@ var/list/name_to_material
use_name = "black cloth" use_name = "black cloth"
icon_colour = "#505050" icon_colour = "#505050"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_green /material/cloth_green
name = "green" name = "green"
@@ -625,6 +643,8 @@ var/list/name_to_material
use_name = "green cloth" use_name = "green cloth"
icon_colour = "#01C608" icon_colour = "#01C608"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_puple /material/cloth_puple
name = "purple" name = "purple"
@@ -632,6 +652,8 @@ var/list/name_to_material
use_name = "purple cloth" use_name = "purple cloth"
icon_colour = "#9C56C4" icon_colour = "#9C56C4"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_blue /material/cloth_blue
name = "blue" name = "blue"
@@ -639,6 +661,8 @@ var/list/name_to_material
use_name = "blue cloth" use_name = "blue cloth"
icon_colour = "#6B6FE3" icon_colour = "#6B6FE3"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_beige /material/cloth_beige
name = "beige" name = "beige"
@@ -646,6 +670,8 @@ var/list/name_to_material
use_name = "beige cloth" use_name = "beige cloth"
icon_colour = "#E8E7C8" icon_colour = "#E8E7C8"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/cloth_lime /material/cloth_lime
name = "lime" name = "lime"
@@ -653,3 +679,5 @@ var/list/name_to_material
use_name = "lime cloth" use_name = "lime cloth"
icon_colour = "#62E36C" icon_colour = "#62E36C"
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300

View File

@@ -150,7 +150,7 @@
if(!target && amount < maxAmount && eattiles || maketiles) // Eat tiles if(!target && amount < maxAmount && eattiles || maketiles) // Eat tiles
if(eattiles) if(eattiles)
for(var/obj/item/stack/tile/plasteel/T in view(src)) for(var/obj/item/stack/tile/steel/T in view(src))
if(T in ignorelist) if(T in ignorelist)
continue continue
target = T target = T
@@ -217,7 +217,7 @@
if(A && (locate(/obj/structure/lattice, A) && building == 1 || !locate(/obj/structure/lattice, A) && building == 2)) // Make sure that it still needs repairs if(A && (locate(/obj/structure/lattice, A) && building == 1 || !locate(/obj/structure/lattice, A) && building == 2)) // Make sure that it still needs repairs
var/obj/item/I var/obj/item/I
if(building == 1) if(building == 1)
I = new /obj/item/stack/tile/plasteel(src) I = new /obj/item/stack/tile/steel(src)
else else
I = PoolOrNew(/obj/item/stack/rods, src) I = PoolOrNew(/obj/item/stack/rods, src)
A.attackby(I, src) A.attackby(I, src)
@@ -232,14 +232,14 @@
visible_message("<span class='notice'>[src] begins to improve the floor.</span>") visible_message("<span class='notice'>[src] begins to improve the floor.</span>")
if(do_after(src, 50)) if(do_after(src, 50))
if(!F.floor_type) if(!F.floor_type)
var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel(src) var/obj/item/stack/tile/steel/T = new /obj/item/stack/tile/steel(src)
F.attackby(T, src) F.attackby(T, src)
addTiles(-1) addTiles(-1)
target = null target = null
repairing = 0 repairing = 0
update_icons() update_icons()
else if(istype(A, /obj/item/stack/tile/plasteel) && amount < maxAmount) else if(istype(A, /obj/item/stack/tile/steel) && amount < maxAmount)
var/obj/item/stack/tile/plasteel/T = A var/obj/item/stack/tile/steel/T = A
visible_message("<span class='notice'>[src] begins to collect tiles.</span>") visible_message("<span class='notice'>[src] begins to collect tiles.</span>")
repairing = 1 repairing = 1
update_icons() update_icons()
@@ -271,7 +271,7 @@
new /obj/item/device/assembly/prox_sensor(Tsec) new /obj/item/device/assembly/prox_sensor(Tsec)
if(prob(50)) if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec) new /obj/item/robot_parts/l_arm(Tsec)
var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel(Tsec) var/obj/item/stack/tile/steel/T = new /obj/item/stack/tile/steel(Tsec)
T.amount = amount T.amount = amount
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src) s.set_up(3, 1, src)
@@ -287,8 +287,8 @@
/* Assembly */ /* Assembly */
/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/plasteel/T, mob/user as mob) /obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/steel/T, mob/user as mob)
if(!istype(T, /obj/item/stack/tile/plasteel)) if(!istype(T, /obj/item/stack/tile/steel))
..() ..()
return return
if(contents.len >= 1) if(contents.len >= 1)

View File

@@ -381,7 +381,8 @@
/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) /mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..() ..()
bodytemperature = max(bodytemperature, BODYTEMP_HEAT_DAMAGE_LIMIT+10) var/temp_inc = max(BODYTEMP_HEATING_MAX*(1-get_heat_protection()), 0)
bodytemperature = min(bodytemperature + temp_inc, exposed_temperature)
/mob/living/carbon/can_use_hands() /mob/living/carbon/can_use_hands()
if(handcuffed) if(handcuffed)

View File

@@ -962,11 +962,18 @@
spawn(rand(20,50)) spawn(rand(20,50))
client.dir = 1 client.dir = 1
if(hallucination<=2) if(hallucination)
hallucination = 0 if(hallucination >= 20)
halloss = 0 if(prob(3))
else fake_attack(src)
hallucination -= 2 if(!handling_hal)
spawn handle_hallucinations() //The not boring kind!
if(client && prob(5))
client.dir = pick(2,4,8)
var/client/C = client
spawn(rand(20,50))
if(C)
C.dir = 1
else else
for(var/atom/a in hallucinations) for(var/atom/a in hallucinations)

View File

@@ -636,17 +636,24 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_inv_head(var/update_icons=1) /mob/living/carbon/human/update_inv_head(var/update_icons=1)
if(head) if(head)
head.screen_loc = ui_head //TODO head.screen_loc = ui_head //TODO
var/image/standing
if(istype(head,/obj/item/clothing/head/kitty)) //Determine the icon to use
standing = image("icon" = head:mob) var/t_icon = INV_HEAD_DEF_ICON
else if(head.icon_override)
if(head.icon_override) t_icon = head.icon_override
standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]") else if(head.sprite_sheets && head.sprite_sheets[species.name])
else if(head.sprite_sheets && head.sprite_sheets[species.name]) t_icon = head.sprite_sheets[species.name]
standing = image("icon" = head.sprite_sheets[species.name], "icon_state" = "[head.icon_state]") else if(head.item_icons && (icon_head in head.item_icons))
else t_icon = head.item_icons[icon_head]
standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
//Determine the state to use
var/t_state = head.icon_state
if(head.item_state)
t_state = head.item_state
//Create the image
var/image/standing = image(icon = t_icon, icon_state = t_state)
if(head.blood_DNA) if(head.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood") var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color bloodsies.color = head.blood_color

View File

@@ -239,6 +239,12 @@
adjust_fire_stacks(2) adjust_fire_stacks(2)
IgniteMob() IgniteMob()
/mob/living/proc/get_cold_protection()
return 0
/mob/living/proc/get_heat_protection()
return 0
//Finds the effective temperature that the mob is burning at. //Finds the effective temperature that the mob is burning at.
/mob/living/proc/fire_burn_temperature() /mob/living/proc/fire_burn_temperature()
if (fire_stacks <= 0) if (fire_stacks <= 0)

View File

@@ -271,9 +271,10 @@
if(ishuman(holder)) if(ishuman(holder))
var/mob/living/carbon/human/H = holder var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/external/affecting in H.organs) for(var/obj/item/organ/external/affecting in H.organs)
if(affecting.hidden == card) if(card in affecting.implants)
affecting.take_damage(rand(30,50)) affecting.take_damage(rand(30,50))
H.visible_message("<span class='danger'>\The [src] explodes out of \the [H]'s [affecting.name][(affecting.status & ORGAN_ROBOT) ? " in a shower of gore" : ""]!</span>") affecting.implants -= card
H.visible_message("<span class='danger'>\The [src] explodes out of \the [H]'s [affecting.name] in shower of gore!</span>")
break break
holder.drop_from_inventory(card) holder.drop_from_inventory(card)
else if(istype(card.loc,/obj/item/device/pda)) else if(istype(card.loc,/obj/item/device/pda))

View File

@@ -372,7 +372,7 @@ var/global/list/robot_modules = list(
C.synths = list(wire) C.synths = list(wire)
src.modules += C src.modules += C
var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src) var/obj/item/stack/tile/steel/cyborg/S = new /obj/item/stack/tile/steel/cyborg(src)
S.synths = list(metal) S.synths = list(metal)
src.modules += S src.modules += S
@@ -695,7 +695,7 @@ var/global/list/robot_modules = list(
C.synths = list(wire) C.synths = list(wire)
src.modules += C src.modules += C
var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src) var/obj/item/stack/tile/steel/cyborg/S = new /obj/item/stack/tile/steel/cyborg(src)
S.synths = list(metal) S.synths = list(metal)
src.modules += S src.modules += S

View File

@@ -190,7 +190,10 @@ datum/preferences
qdel(I) qdel(I)
var/jobflag var/jobflag
var/dept var/dept
if(job_civilian_high) if (job_civilian_low & ASSISTANT)
jobflag = job_civilian_low
dept = CIVILIAN
else if(job_civilian_high)
jobflag = job_civilian_high jobflag = job_civilian_high
dept = CIVILIAN dept = CIVILIAN
else if (job_medsci_high) else if (job_medsci_high)
@@ -199,7 +202,6 @@ datum/preferences
else if (job_engsec_high) else if (job_engsec_high)
jobflag = job_engsec_high jobflag = job_engsec_high
dept = ENGSEC dept = ENGSEC
if(jobflag && dept && job_master) if(jobflag && dept && job_master)
for (var/datum/job/J in job_master.occupations) for (var/datum/job/J in job_master.occupations)
if((J.department_flag & dept) && (J.flag & jobflag)) if((J.department_flag & dept) && (J.flag & jobflag))

View File

@@ -2,6 +2,7 @@
//Having them here also makes for a nice reference list of the various overlay-updating procs available //Having them here also makes for a nice reference list of the various overlay-updating procs available
//default item on-mob icons //default item on-mob icons
#define INV_HEAD_DEF_ICON 'icons/mob/head.dmi'
#define INV_BACK_DEF_ICON 'icons/mob/back.dmi' #define INV_BACK_DEF_ICON 'icons/mob/back.dmi'
#define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi' #define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi'
#define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi' #define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi'

View File

@@ -42,7 +42,6 @@
var/cavity = 0 var/cavity = 0
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails. var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/encased // Needs to be opened with a saw to access the organs. var/encased // Needs to be opened with a saw to access the organs.
var/obj/item/hidden = null
var/list/implants = list() var/list/implants = list()
var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often
var/joint = "joint" // Descriptive string used in dislocation. var/joint = "joint" // Descriptive string used in dislocation.

View File

@@ -8,6 +8,7 @@
gender = PLURAL gender = PLURAL
icon = 'icons/obj/bureaucracy.dmi' icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paper" icon_state = "paper"
item_state = "paper"
throwforce = 0 throwforce = 0
w_class = 1.0 w_class = 1.0
throw_range = 1 throw_range = 1

View File

@@ -165,7 +165,7 @@
explosion(src.loc,1,2,4) explosion(src.loc,1,2,4)
else if (reagents.total_volume > 100) else if (reagents.total_volume > 100)
explosion(src.loc,0,1,3) explosion(src.loc,0,1,3)
else else if (reagents.total_volume > 50)
explosion(src.loc,-1,1,2) explosion(src.loc,-1,1,2)
if(src) if(src)
qdel(src) qdel(src)

View File

@@ -120,8 +120,9 @@
var/closing = 0 var/closing = 0
/datum/computer/file/embedded_program/docking/simple/escape_pod/proc/arm() /datum/computer/file/embedded_program/docking/simple/escape_pod/proc/arm()
armed = 1 if(!armed)
open_door() armed = 1
open_door()
/datum/computer/file/embedded_program/docking/simple/escape_pod/receive_user_command(command) /datum/computer/file/embedded_program/docking/simple/escape_pod/receive_user_command(command)

View File

@@ -28,7 +28,7 @@
/obj/item/weapon/scalpel/laser1 = 75, \ /obj/item/weapon/scalpel/laser1 = 75, \
/obj/item/weapon/melee/energy/sword = 5 /obj/item/weapon/melee/energy/sword = 5
) )
priority = 2
min_duration = 90 min_duration = 90
max_duration = 110 max_duration = 110
@@ -69,7 +69,7 @@
allowed_tools = list( allowed_tools = list(
/obj/item/weapon/scalpel/manager = 100 /obj/item/weapon/scalpel/manager = 100
) )
priority = 2
min_duration = 80 min_duration = 80
max_duration = 120 max_duration = 120

View File

@@ -51,7 +51,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..()) if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone) var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && !affected.cavity && !affected.hidden return affected && !affected.cavity
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone) var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -106,7 +106,15 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..()) if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone) var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && !istype(user,/mob/living/silicon/robot) && !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected) if(istype(user,/mob/living/silicon/robot))
return
if(affected && affected.cavity)
var/total_volume = tool.w_class
for(var/obj/item/I in affected.implants)
if(istype(I,/obj/item/weapon/implant))
continue
total_volume += I.w_class
return total_volume <= get_max_wclass(affected)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone) var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -126,8 +134,8 @@
affected.wounds += I affected.wounds += I
affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1)
user.drop_item() user.drop_item()
affected.hidden = tool affected.implants += tool
tool.loc = target tool.loc = affected
affected.cavity = 0 affected.cavity = 0
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
@@ -162,7 +170,7 @@
if (affected.implants.len) if (affected.implants.len)
var/obj/item/obj = affected.implants[1] var/obj/item/obj = pick(affected.implants)
if(istype(obj,/obj/item/weapon/implant)) if(istype(obj,/obj/item/weapon/implant))
var/obj/item/weapon/implant/imp = obj var/obj/item/weapon/implant/imp = obj
@@ -189,6 +197,8 @@
worm.leave_host() worm.leave_host()
else else
obj.loc = get_turf(target) obj.loc = get_turf(target)
obj.add_blood(target)
obj.update_icon()
if(istype(obj,/obj/item/weapon/implant)) if(istype(obj,/obj/item/weapon/implant))
var/obj/item/weapon/implant/imp = obj var/obj/item/weapon/implant/imp = obj
imp.imp_in = null imp.imp_in = null
@@ -196,16 +206,6 @@
else else
user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \ user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \
"\blue There's something inside [target]'s [affected.name], but you just missed it this time." ) "\blue There's something inside [target]'s [affected.name], but you just missed it this time." )
else if (affected.hidden)
user.visible_message("\blue [user] takes something out of [target]'s [affected.name] with \the [tool].", \
"\blue You take something out of [target]'s [affected.name]s with \the [tool]." )
affected.hidden.loc = get_turf(target)
if(!affected.hidden.blood_DNA)
affected.hidden.blood_DNA = list()
affected.hidden.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type
affected.hidden.update_icon()
affected.hidden = null
else else
user.visible_message("\blue [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ user.visible_message("\blue [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \
"\blue You could not find anything inside [target]'s [affected.name]." ) "\blue You could not find anything inside [target]'s [affected.name]." )

View File

@@ -232,6 +232,7 @@
gas[g] = gas[g] * (1 - ratio) gas[g] = gas[g] * (1 - ratio)
removed.temperature = temperature removed.temperature = temperature
removed.volume = volume * group_multiplier / out_group_multiplier
update_values() update_values()
removed.update_values() removed.update_values()

View File

@@ -179,9 +179,10 @@ var/world_topic_spam_protect_time = world.timeofday
return "Bad Key" return "Bad Key"
var/client/C var/client/C
var/req_ckey = ckey(input["adminmsg"])
for(var/client/K in clients) for(var/client/K in clients)
if(K.ckey == input["adminmsg"]) if(K.ckey == req_ckey)
C = K C = K
break break
if(!C) if(!C)
@@ -222,10 +223,28 @@ var/world_topic_spam_protect_time = world.timeofday
world_topic_spam_protect_ip = addr world_topic_spam_protect_ip = addr
return "Bad Key" return "Bad Key"
return show_player_info_irc(input["notes"]) return show_player_info_irc(ckey(input["notes"]))
else if(copytext(T,1,4) == "age")
var/input[] = params2list(T)
if(input["key"] != config.comms_password)
if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50)
spawn(50)
world_topic_spam_protect_time = world.time
return "Bad Key (Throttled)"
world_topic_spam_protect_time = world.time
world_topic_spam_protect_ip = addr
return "Bad Key"
var/age = get_player_age(input["age"])
if(isnum(age))
if(age >= 0)
return "[age]"
else
return "Ckey not found"
else
return "Database connection failed or not set up"
/world/Reboot(var/reason) /world/Reboot(var/reason)

View File

@@ -60,6 +60,29 @@
<h3 class="author">PsiOmegaDelta updated:</h3> <h3 class="author">PsiOmegaDelta updated:</h3>
<ul class="changes bgimages16"> <ul class="changes bgimages16">
<li class="tweak">The traitor uplink no longer displays all items in a long list, instead has categories which when accessed shows the relevant items.</li> <li class="tweak">The traitor uplink no longer displays all items in a long list, instead has categories which when accessed shows the relevant items.</li>
<h2 class="date">24 June 2015</h2>
<h3 class="author">HarpyEagle updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed Tajaran name generation producing names without a space between first and last.</li>
<li class="wip">Adds docking to the mercenary shuttle. Works similarly to other shuttles, except docking and undocking is manually initiated and not automatic. A system to approve or deny dock requests still to be implemented.</li>
<li class="rscadd">Toolboxes can now hold larger items, such as stacks of metal or power cells, at the cost of having less space for other things.</li>
<li class="tweak">Gloves/shoes can now be worn even if you have one hand/foot missing. The other one still has to be present, of course. The items still drop when you first lose the hand/foot.</li>
<li class="tweak">Budget insulated gloves are somewhat less useless. On average, they will stop half the damage from getting shocked, and the worst case insulation is not as bad as it used to be. Budget gloves that are as good as regular insulated gloves are still as rare as they were before though.</li>
<li class="tweak">PTR bullets are now hitscan, to make them somewhat better for actual sniping.</li>
<li class="maptweak">The telecoms server room now has an actual cycling airlock into it.</li>
<li class="tweak">Non-vital body parts will no longer take further damage above a certain amount, and will inflict paincrit effects instead. On most humaniods the head, chest, and groin are vital.</li>
<li class="rscadd">Engineers now spawn with industrial workboots (credit: ChessPiece/Bishop).</li>
<li class="bugfix">Damaged robotic legs now more likely to have an effect.</li>
<li class="bugfix">Fixed bug preventing internal organs from taking damage in some cases.</li>
<li class="maptweak">New flavours of tables around the station. Engineering starts with more plastic.</li>
<li class="bugfix">Fixed worn items not appearing in some cases. Most notably crossbows and certain guns when worn on the back. As a side effect, laundry machines no longer transform items.</li>
<li class="bugfix">Crit oxyloss now runs in game time instead of real time. So if lag is slowing your movement the same slowdown applies to the dying person you're trying to reach.</li>
<li class="rscadd">Breathmasks can now be adjusted by clicking on them in your hand, in addition to the verb.</li>
<li class="rscadd">Wearing a space helmet or similar face-covering gear now prevents eating and force-feeding food, drink, and pills.</li>
<li class="rscadd">Phoron in air ignites above it's flashpoint temperature and a certain (very small) minimum concentration. Environments that have oxygen and are hot enough, and have phoron but not enough concentration to burn will produce flareouts, which are mostly a visual effect.</li>
<li class="rscadd">Adds animation when making unarmed attacks or attacking with melee weapons, to help make it clearer who is attacking.</li>
<li class="soundadd">Opening an unpowered door now has an appropriate sound.</li>
<li class="rscadd">Ingesting diseased blood may contract the disease.</li>
</ul> </ul>
<h2 class="date">19 June 2015</h2> <h2 class="date">19 June 2015</h2>

View File

@@ -2052,3 +2052,4 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
to help make it clearer who is attacking. to help make it clearer who is attacking.
- soundadd: Opening an unpowered door now has an appropriate sound. - soundadd: Opening an unpowered door now has an appropriate sound.
- rscadd: Ingesting diseased blood may contract the disease. - rscadd: Ingesting diseased blood may contract the disease.
2015-06-26: {}

View File

@@ -29,7 +29,7 @@
"aC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) "aC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aD" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) "aD" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aE" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) "aE" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aF" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost,/turf/simulated/floor,/area/constructionsite/teleporter) "aF" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost{c_tag = "Construction Site Teleporter"},/turf/simulated/floor,/area/constructionsite/teleporter)
"aG" = (/obj/structure/table/reinforced,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) "aG" = (/obj/structure/table/reinforced,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aH" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) "aH" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aI" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) "aI" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)