/turf/open var/slowdown = 0 //negative for faster, positive for slower var/wet = 0 var/wet_time = 0 // Time in seconds that this floor will be wet for. var/mutable_appearance/wet_overlay var/postdig_icon_change = FALSE var/postdig_icon var/list/archdrops /turf/open/indestructible name = "floor" icon = 'icons/turf/floors.dmi' icon_state = "floor" /turf/open/indestructible/TerraformTurf(path, defer_change = FALSE, ignore_air = FALSE) return /turf/open/indestructible/sound name = "squeeky floor" var/sound /turf/open/indestructible/sound/Entered(var/mob/AM) ..() if(istype(AM)) playsound(src,sound,50,1) /turf/open/indestructible/necropolis name = "necropolis floor" desc = "It's regarding you suspiciously." icon = 'icons/turf/floors.dmi' icon_state = "necro1" baseturfs = /turf/open/indestructible/necropolis initial_gas_mix = LAVALAND_DEFAULT_ATMOS /turf/open/indestructible/necropolis/Initialize() . = ..() if(prob(12)) icon_state = "necro[rand(2,3)]" /turf/open/indestructible/necropolis/air initial_gas_mix = "o2=22;n2=82;TEMP=293.15" /turf/open/indestructible/boss //you put stone tiles on this and use it as a base name = "necropolis floor" icon = 'icons/turf/boss_floors.dmi' icon_state = "boss" baseturfs = /turf/open/indestructible/boss initial_gas_mix = LAVALAND_DEFAULT_ATMOS /turf/open/indestructible/boss/air initial_gas_mix = "o2=22;n2=82;TEMP=293.15" /turf/open/indestructible/hierophant icon = 'icons/turf/floors/hierophant_floor.dmi' initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant smooth = SMOOTH_TRUE /turf/open/indestructible/hierophant/two /turf/open/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE /turf/open/indestructible/paper name = "notebook floor" desc = "A floor made of invulnerable notebook paper." icon_state = "paperfloor" /turf/open/indestructible/clock_spawn_room name = "cogmetal" desc = "Brass plating that gently radiates heat. For some reason, it reminds you of blood." icon_state = "reebe" baseturfs = /turf/open/indestructible/clock_spawn_room /turf/open/indestructible/clock_spawn_room/Entered() ..() START_PROCESSING(SSfastprocess, src) /turf/open/indestructible/clock_spawn_room/Destroy() STOP_PROCESSING(SSfastprocess, src) . = ..() /turf/open/indestructible/clock_spawn_room/process() if(!port_servants()) STOP_PROCESSING(SSfastprocess, src) /turf/open/indestructible/clock_spawn_room/proc/port_servants() . = FALSE for(var/mob/living/L in src) if(is_servant_of_ratvar(L) && L.stat != DEAD) . = TRUE L.forceMove(get_turf(pick(GLOB.servant_spawns))) visible_message("[L] vanishes in a flash of red!") L.visible_message("[L] appears in a flash of red!", \ "sas'so c'arta forbici
You're yanked away from [src]!") playsound(src, 'sound/magic/enter_blood.ogg', 50, TRUE) playsound(L, 'sound/magic/exit_blood.ogg', 50, TRUE) flash_color(L, flash_color = "#C80000", flash_time = 10) /turf/open/Initalize_Atmos(times_fired) excited = 0 update_visuals() current_cycle = times_fired //cache some vars var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs for(var/direction in GLOB.cardinals) var/turf/open/enemy_tile = get_step(src, direction) if(!istype(enemy_tile)) if (atmos_adjacent_turfs) atmos_adjacent_turfs -= enemy_tile continue var/datum/gas_mixture/enemy_air = enemy_tile.return_air() //only check this turf, if it didn't check us when it was initalized if(enemy_tile.current_cycle < times_fired) if(CANATMOSPASS(src, enemy_tile)) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(enemy_tile.atmos_adjacent_turfs) atmos_adjacent_turfs[enemy_tile] = TRUE enemy_tile.atmos_adjacent_turfs[src] = TRUE else if (atmos_adjacent_turfs) atmos_adjacent_turfs -= enemy_tile if (enemy_tile.atmos_adjacent_turfs) enemy_tile.atmos_adjacent_turfs -= src UNSETEMPTY(enemy_tile.atmos_adjacent_turfs) continue else if (!atmos_adjacent_turfs || !atmos_adjacent_turfs[enemy_tile]) continue var/is_active = air.compare(enemy_air) if(is_active) //testing("Active turf found. Return value of compare(): [is_active]") if(!excited) //make sure we aren't already excited excited = 1 SSair.active_turfs |= src UNSETEMPTY(atmos_adjacent_turfs) if (atmos_adjacent_turfs) src.atmos_adjacent_turfs = atmos_adjacent_turfs /turf/open/proc/GetHeatCapacity() . = air.heat_capacity() /turf/open/proc/GetTemperature() . = air.temperature /turf/open/proc/TakeTemperature(temp) air.temperature += temp air_update_turf() /turf/open/proc/freon_gas_act() for(var/obj/I in contents) if(I.resistance_flags & FREEZE_PROOF) return if(!(I.flags_2 & FROZEN_2)) //let it go I.make_frozen_visual() for(var/mob/living/L in contents) if(L.bodytemperature <= 50) L.apply_status_effect(/datum/status_effect/freon) MakeSlippery(TURF_WET_PERMAFROST, 5) return 1 /turf/open/proc/water_vapor_gas_act() MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) for(var/mob/living/simple_animal/slime/M in src) M.apply_water() SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) for(var/obj/effect/O in src) if(is_cleanable(O)) qdel(O) return 1 /turf/open/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) if(C.movement_type & FLYING) return 0 if(has_gravity(src)) var/obj/buckled_obj if(C.buckled) buckled_obj = C.buckled if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube. return 0 else if(C.lying || !(C.status_flags & CANKNOCKDOWN)) // can't slip unbuckled mob if they're lying or can't fall. return 0 if(C.m_intent == MOVE_INTENT_WALK && (lube&NO_SLIP_WHEN_WALKING)) return 0 if(!(lube&SLIDE_ICE)) to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!") C.log_message("Slipped[O ? " on the [O.name]" : ""][(lube&SLIDE)? " (LUBE)" : ""]!", INDIVIDUAL_ATTACK_LOG) if(!(lube&SLIDE_ICE)) playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) for(var/obj/item/I in C.held_items) C.accident(I) var/olddir = C.dir if(!(lube & SLIDE_ICE)) C.Knockdown(knockdown_amount) C.stop_pulling() else C.Stun(20) if(buckled_obj) buckled_obj.unbuckle_mob(C) lube |= SLIDE_ICE if(lube&SLIDE) new /datum/forced_movement(C, get_ranged_target_turf(C, olddir, 4), 1, FALSE, CALLBACK(C, /mob/living/carbon/.proc/spin, 1, 1)) else if(lube&SLIDE_ICE) new /datum/forced_movement(C, get_ranged_target_turf(C, olddir, 1), 1, FALSE) //spinning would be bad for ice, fucks up the next dir return 1 /turf/open/copyTurf(turf/T) . = ..() if(. && isopenturf(T) && wet_time) var/turf/open/O = T O.MakeSlippery(wet_setting = wet, wet_time_to_add = wet_time) //we're copied, copy how wet we are also /turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost, 5 = Slide wet_time = max(wet_time+wet_time_to_add, min_wet_time) if(wet >= wet_setting) return wet = wet_setting UpdateSlip() if(wet_setting != TURF_DRY) if(wet_overlay) cut_overlay(wet_overlay) else wet_overlay = mutable_appearance() var/turf/open/floor/F = src if(istype(F)) if(wet_setting == TURF_WET_PERMAFROST) wet_overlay.icon = 'icons/effects/water.dmi' wet_overlay.icon_state = "ice_floor" else if(wet_setting == TURF_WET_ICE) wet_overlay.icon = 'icons/turf/overlays.dmi' wet_overlay.icon_state = "snowfloor" else wet_overlay.icon = 'icons/effects/water.dmi' wet_overlay.icon_state = "wet_floor_static" else wet_overlay.icon = 'icons/effects/water.dmi' wet_overlay.icon_state = "wet_static" add_overlay(wet_overlay) HandleWet() /turf/open/proc/UpdateSlip() var/intensity var/lube_flags switch(wet) if(TURF_WET_WATER) intensity = 60 lube_flags = NO_SLIP_WHEN_WALKING if(TURF_WET_LUBE) intensity = 80 lube_flags = SLIDE | GALOSHES_DONT_HELP if(TURF_WET_ICE) intensity = 120 lube_flags = SLIDE | GALOSHES_DONT_HELP if(TURF_WET_PERMAFROST) intensity = 120 lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP if(TURF_WET_SLIDE) intensity = 80 lube_flags = SLIDE | GALOSHES_DONT_HELP else qdel(GetComponent(/datum/component/slippery)) return var/datum/component/slippery/S = LoadComponent(/datum/component/slippery, NONE, CALLBACK(src, .proc/AfterSlip)) S.intensity = intensity S.lube_flags = lube_flags /turf/open/proc/AfterSlip(mob/living/L) if(wet == TURF_WET_LUBE) L.confused = max(L.confused, 8) /turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER) if(wet > wet_setting || !wet) return spawn(rand(0,20)) if(wet == TURF_WET_PERMAFROST) wet = TURF_WET_ICE else if(wet == TURF_WET_ICE) wet = TURF_WET_WATER else wet = TURF_DRY if(wet_overlay) cut_overlay(wet_overlay) UpdateSlip() /turf/open/proc/HandleWet() if(!wet) //It's possible for this handler to get called after all the wetness is //cleared, so bail out if that is the case return if(!wet_time && wet < TURF_WET_ICE) MakeDry(TURF_WET_ICE) if(wet_time > MAXIMUM_WET_TIME) wet_time = MAXIMUM_WET_TIME if(wet == TURF_WET_ICE && air.temperature > T0C) for(var/obj/O in contents) if(O.flags_2 & FROZEN_2) O.make_unfrozen() MakeDry(TURF_WET_ICE) MakeSlippery(TURF_WET_WATER) if(wet != TURF_WET_PERMAFROST) switch(air.temperature) if(-INFINITY to T0C) if(wet != TURF_WET_ICE && wet) MakeDry(TURF_WET_ICE) MakeSlippery(TURF_WET_ICE) if(T0C to T20C) wet_time = max(0, wet_time-1) if(T20C to T0C + 40) wet_time = max(0, wet_time-2) if(T0C + 40 to T0C + 60) wet_time = max(0, wet_time-3) if(T0C + 60 to T0C + 80) wet_time = max(0, wet_time-5) if(T0C + 80 to T0C + 100) wet_time = max(0, wet_time-10) if(T0C + 100 to INFINITY) wet_time = 0 else if (GetTemperature() > BODYTEMP_COLD_DAMAGE_LIMIT) //seems like a good place MakeDry(TURF_WET_PERMAFROST) else wet_time = max(0, wet_time-5) if(wet && wet < TURF_WET_ICE && !wet_time) MakeDry(TURF_WET_ICE) if(!wet && wet_time) wet_time = 0 if(wet) addtimer(CALLBACK(src, .proc/HandleWet), 15, TIMER_UNIQUE) /turf/open/get_dumping_location() return src /turf/open/proc/ClearWet()//Nuclear option of immediately removing slipperyness from the tile instead of the natural drying over time wet = TURF_DRY UpdateSlip() if(wet_overlay) cut_overlay(wet_overlay) /turf/open/rad_act(pulse_strength) . = ..() if (air.gases[/datum/gas/carbon_dioxide] && air.gases[/datum/gas/oxygen]) pulse_strength = min(pulse_strength,air.gases[/datum/gas/carbon_dioxide][MOLES]*1000,air.gases[/datum/gas/oxygen][MOLES]*2000) //Ensures matter is conserved properly air.gases[/datum/gas/carbon_dioxide][MOLES]=max(air.gases[/datum/gas/carbon_dioxide][MOLES]-(pulse_strength/1000),0) air.gases[/datum/gas/oxygen][MOLES]=max(air.gases[/datum/gas/oxygen][MOLES]-(pulse_strength/2000),0) air.assert_gas(/datum/gas/pluoxium) air.gases[/datum/gas/pluoxium][MOLES]+=(pulse_strength/4000) air.garbage_collect()