Ports Mloc's Refactor of buckling, All /obj can now buckle things. HE Pipes now change colour based on heat.

This commit is contained in:
Remie Richards
2015-01-14 19:07:18 +00:00
parent 85b277c404
commit 17654037db
19 changed files with 140 additions and 193 deletions

View File

@@ -6,10 +6,14 @@
var/initialize_directions_he
minimum_temperature_difference = 20
thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT
color = "#404040"
buckle_lying = 1
var/icon_temperature = T20C //stop small changes in temperature causing icon refresh
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/New()
..()
initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe
color = "#404040"
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize()
normalize_dir()
@@ -29,6 +33,8 @@
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/process()
var/environment_temperature = 0
var/datum/gas_mixture/pipe_air = return_air()
if(istype(loc, /turf/simulated))
if(loc:blocks_air)
environment_temperature = loc:temperature
@@ -37,10 +43,41 @@
environment_temperature = environment.temperature
else
environment_temperature = loc:temperature
var/datum/gas_mixture/pipe_air = return_air()
if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference)
parent.temperature_interact(loc, volume, thermal_conductivity)
//Burn any mobs buckled to ourselves based on our temperature
if(buckled_mob)
var/hc = pipe_air.heat_capacity()
var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500)
pipe_air.temperature = avg_temp
buckled_mob.bodytemperature = avg_temp
var/heat_limit = 1000
if(pipe_air.temperature > heat_limit + 1)
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest")
//Heat causes pipe to glow
if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //glow starts at 500K
if(abs(pipe_air.temperature - icon_temperature) > 10)
icon_temperature = pipe_air.temperature
var/h_r = heat2colour_r(icon_temperature)
var/h_g = heat2colour_g(icon_temperature)
var/h_b = heat2colour_b(icon_temperature)
if(icon_temperature < 2000)//scale glow until 2000K
var/scale = (icon_temperature - 500) / 1500
h_r = 64 + (h_r - 64) * scale
h_g = 64 + (h_g - 64) * scale
h_b = 64 + (h_b - 64) * scale
animate(src, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING)
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction
icon = 'icons/obj/pipes/junction.dmi'
icon_state = "intact"

View File

@@ -8,6 +8,11 @@
var/alert_pressure = 80*ONE_ATMOSPHERE
//minimum pressure before check_pressure(...) should be called
//Buckling
can_buckle = 1
buckle_requires_restraints = 1
buckle_lying = -1
/obj/machinery/atmospherics/proc/pipeline_expansion()
return null

View File

@@ -509,4 +509,38 @@ for(var/t in test_times)
if(bpc & FOOT_RIGHT)
covered_parts |= list("r_leg")
return covered_parts
return covered_parts
//adapted from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/
/proc/heat2colour(temp)
return rgb(heat2colour_r(temp), heat2colour_g(temp), heat2colour_b(temp))
/proc/heat2colour_r(temp)
temp /= 100
if(temp <= 66)
. = 255
else
. = max(0, min(255, 329.698727446 * (temp - 60) ** -0.1332047592))
/proc/heat2colour_g(temp)
temp /= 100
if(temp <= 66)
. = max(0, min(255, 99.4708025861 * log(temp) - 161.1195681661))
else
. = max(0, min(255, 288.1221685293 * ((temp - 60) ** -0.075148492)))
/proc/heat2colour_b(temp)
temp /= 100
if(temp >= 66)
. = 255
else
if(temp <= 16)
. = 0
else
. = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307))

View File

@@ -121,7 +121,7 @@
if(isliving(teleatom))
var/mob/living/L = teleatom
if(L.buckled)
L.buckled.unbuckle()
L.buckled.unbuckle_mob()
destarea.Entered(teleatom)

View File

@@ -47,7 +47,7 @@
return
if(target && target.buckled)
target.buckled.unbuckle()
target.buckled.unbuckle_mob()
var/list/tempL = L
var/attempt = null

View File

@@ -28,7 +28,7 @@
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
target.buckled.unbuckle()
target.buckled.unbuckle_mob()
jaunt_disappear(animation, target)
target.loc = holder
target.notransform=0 //mob is safely inside holder now, no need for protection.

View File

@@ -17,6 +17,8 @@
if (C_imp_in.handcuffed)
var/obj/item/weapon/W = C_imp_in.handcuffed
C_imp_in.handcuffed = null
if(C_imp_in.buckled && C_imp_in.buckled.buckle_requires_restraints)
C_imp_in.buckled.unbuckle_mob()
C_imp_in.update_inv_handcuffed(0)
if (C_imp_in.client)
C_imp_in.client.screen -= W

View File

@@ -77,7 +77,7 @@
return
if(user && user.buckled)
user.buckled.unbuckle()
user.buckled.unbuckle_mob()
var/list/tempL = L.Copy()
var/attempt = null

View File

@@ -119,6 +119,8 @@
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
qdel(C.handcuffed)
C.handcuffed = null
if(C.buckled && C.buckled.buckle_requires_restraints)
C.buckled.unbuckle_mob()
C.update_inv_handcuffed(0)
return
else

View File

@@ -210,7 +210,7 @@
/obj/structure/stool/bed/chair/janicart/relaymove(mob/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis)
unbuckle()
unbuckle_mob()
if(istype(user.l_hand, /obj/item/key) || istype(user.r_hand, /obj/item/key))
if(!Process_Spacemove(direction))
return
@@ -221,29 +221,17 @@
user << "<span class='notice'>You'll need the keys in one of your hands to drive this [callme].</span>"
/obj/structure/stool/bed/chair/janicart/buckle_mob(mob/M, mob/user)
if(M != user || !ismob(M) || get_dist(src, user) > 1 || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon))
return
unbuckle()
M.visible_message(\
"<span class='notice'>[M] climbs onto the [callme]!</span>",\
"<span class='notice'>You climb onto the [callme]!</span>")
M.buckled = src
M.loc = loc
M.dir = dir
M.update_canmove()
buckled_mob = M
/obj/structure/stool/bed/chair/janicart/post_buckle_mob(mob/living/M)
update_mob()
add_fingerprint(user)
return ..()
/obj/structure/stool/bed/chair/janicart/unbuckle()
if(buckled_mob)
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
..()
/obj/structure/stool/bed/chair/janicart/unbuckle_mob()
var/mob/living/M = ..()
if(M)
M.pixel_x = 0
M.pixel_y = 0
return M
/obj/structure/stool/bed/chair/janicart/handle_rotation()

View File

@@ -7,6 +7,7 @@
icon_state = "nest"
var/health = 100
/*
/obj/structure/stool/bed/nest/unbuckle_other(mob/user as mob)
buckled_mob.visible_message(\
"<span class='notice'>[user.name] pulls [buckled_mob.name] free from the sticky nest!</span>",\
@@ -22,8 +23,9 @@
spawn(600)
if(user && buckled_mob && user.buckled == src)
unbuckle()
*/
/obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob)
/obj/structure/stool/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob)
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
return
@@ -32,7 +34,7 @@
if(!istype(user,/mob/living/carbon/alien/humanoid))
return
unbuckle()
unbuckle_mob()
if(M == usr)
return
@@ -41,24 +43,19 @@
"<span class='notice'>[user.name] secretes a thick vile goo, securing [M.name] into [src]!</span>",\
"<span class='warning'>[user.name] drenches you in a foul-smelling resin, trapping you in [src]!</span>",\
"<span class='notice'>You hear squelching...</span>")
M.buckled = src
M.loc = src.loc
M.dir = src.dir
M.update_canmove()
M.pixel_y += 1
M.pixel_x += 2
M.anchored = anchored
src.buckled_mob = M
src.add_fingerprint(user)
src.overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6)
return
/obj/structure/stool/bed/nest/unbuckle()
if(buckled_mob)
/obj/structure/stool/bed/nest/post_buckle_mob(mob/living/M)
if(M == buckled_mob)
M.pixel_y += 1
M.pixel_x += 2
overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6)
else
buckled_mob.pixel_y -= 1
buckled_mob.pixel_x -= 2
overlays.Cut()
..()
overlays.Cut()
/obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/aforce = W.force

View File

@@ -11,17 +11,14 @@
name = "bed"
desc = "This is used to lie in, sleep in or strap on."
icon_state = "bed"
var/mob/living/buckled_mob
can_buckle = 1
buckle_lying = 1
/obj/structure/stool/bed/alien
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
icon_state = "abed"
/obj/structure/stool/bed/Destroy()
unbuckle()
..()
/obj/structure/stool/bed/Move(atom/newloc, direct) //Some bed children move
. = ..()
if(buckled_mob)
@@ -47,99 +44,12 @@
/obj/structure/stool/bed/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/structure/stool/bed/attack_hand(mob/user as mob)
manual_unbuckle(user)
return
/obj/structure/stool/bed/attack_animal(var/mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever
if(M.environment_smash)
new /obj/item/stack/sheet/metal(src.loc)
qdel(src)
return
manual_unbuckle(M)
/obj/structure/stool/bed/MouseDrop_T(mob/M as mob, mob/user as mob)
if(!istype(M)) return
buckle_mob(M, user)
return
/obj/structure/stool/bed/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled
return
/obj/structure/stool/bed/proc/unbuckle()
if(buckled_mob)
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove()
var/mob/M = buckled_mob
buckled_mob = null
M.newtonian_move(inertia_dir)
afterbuckle(M)
return
/obj/structure/stool/bed/proc/manual_unbuckle(mob/user as mob)
if(buckled_mob)
if(buckled_mob.buckled == src)
if(buckled_mob != user)
if(!(user.buckled))
unbuckle_other(user)
else
user << "<span class='notice'>You can't reach [src]!</span>"
else
unbuckle_myself(user)
src.add_fingerprint(user)
return
/obj/structure/stool/bed/proc/unbuckle_other(mob/user as mob)
buckled_mob.visible_message(\
"<span class='notice'>[buckled_mob.name] was unbuckled by [user.name]!</span>",\
"You were unbuckled from [src] by [user.name].",\
"You hear metal clanking.")
unbuckle()
/obj/structure/stool/bed/proc/unbuckle_myself(mob/user as mob)
buckled_mob.visible_message(\
"<span class='notice'>[buckled_mob.name] unbuckled!</span>",\
"You unbuckle yourself from [src].",\
"You hear metal clanking.")
unbuckle()
/obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob)
if (!ticker)
user << "You can't buckle anyone in before the game starts."
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon/pai) || M.anchored)
return
if (istype(M, /mob/living/carbon/slime) || istype(M, /mob/living/simple_animal/slime))
user << "\The [M] is too squishy to buckle in."
return
unbuckle()
if (M == usr)
M.visible_message(\
"<span class='notice'>[M.name] buckles in!</span>",\
"You buckle yourself to [src].",\
"You hear metal clanking")
else
M.visible_message(\
"<span class='notice'>[M.name] is buckled in to [src] by [user.name]!</span>",\
"You are buckled in to [src] by [user.name].",\
"You hear metal clanking")
M.buckled = src
M.anchored = anchored
M.loc = src.loc
M.dir = src.dir
M.update_canmove()
src.buckled_mob = M
src.add_fingerprint(user)
afterbuckle(M)
return
/*
* Roller beds
@@ -151,18 +61,19 @@
anchored = 0
var/const/buckled_pixel_y_offset = 6 //Mobs buckled will have their pixel_y offset by this much
/obj/structure/stool/bed/roller/afterbuckle(mob/M as mob)
if(buckled_mob)
/obj/structure/stool/bed/roller/post_buckle_mob(mob/M)
if(M == buckled_mob)
density = 1
icon_state = "up"
M.pixel_y = initial(M.pixel_y)
else
density = 0
icon_state = "down"
M.pixel_y = initial(M.pixel_y)
if(M.lying)
M.pixel_y -= buckled_pixel_y_offset
if(buckled_mob)
buckled_mob.pixel_y = initial(buckled_mob.pixel_y)
if(buckled_mob.lying)
buckled_mob.pixel_y -= buckled_pixel_y_offset
/obj/item/roller

View File

@@ -2,6 +2,7 @@
name = "chair"
desc = "You sit in this. Either by will or force."
icon_state = "chair"
buckle_lying = 0 //you sit in a chair, not lay
/obj/structure/stool/bed/chair/New()
..()
@@ -68,10 +69,6 @@
return
spin()
/obj/structure/stool/bed/chair/MouseDrop_T(mob/M as mob, mob/user as mob)
if(!istype(M)) return
buckle_mob(M, user)
return
// Chair types
/obj/structure/stool/bed/chair/wood/normal
@@ -105,12 +102,13 @@
return ..()
/obj/structure/stool/bed/chair/comfy/afterbuckle()
/obj/structure/stool/bed/chair/comfy/post_buckle_mob(mob/living/M)
if(buckled_mob)
overlays += armrest
else
overlays -= armrest
/obj/structure/stool/bed/chair/comfy/brown
color = rgb(255,113,0)

View File

@@ -211,7 +211,6 @@
pass_flags = PASSTABLE | PASSGRILLE
var/energy = 0
var/obj/effect/spacevine_controller/master = null
var/mob/living/buckled_mob
var/list/mutations = list()
/obj/effect/spacevine/New()
@@ -285,7 +284,7 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user)) qdel(src)
else
manual_unbuckle(user)
user_unbuckle_mob(user,user)
return
//Plant-b-gone damage is handled in its entry in chemistry-reagents.dm
..()
@@ -298,46 +297,16 @@
/obj/effect/spacevine/attack_hand(mob/user as mob)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
manual_unbuckle(user)
user_unbuckle_mob(user, user)
/obj/effect/spacevine/attack_paw(mob/living/user as mob)
user.do_attack_animation(src)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
manual_unbuckle(user)
user_unbuckle_mob(user,user)
/obj/effect/spacevine/proc/unbuckle()
if(buckled_mob)
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove()
buckled_mob = null
return
/obj/effect/spacevine/proc/manual_unbuckle(mob/user as mob)
if(buckled_mob)
if(prob(50))
if(buckled_mob.buckled == src)
if(buckled_mob != user)
buckled_mob.visible_message(\
"<span class='notice'>[user.name] frees [buckled_mob.name] from the vines.</span>",\
"<span class='notice'>[user.name] frees you from the vines.</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
else
buckled_mob.visible_message(\
"<span class='notice'>[buckled_mob.name] struggles free of the vines.</span>",\
"<span class='notice'>You untangle the vines from around yourself.</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
unbuckle()
else
var/text = pick("rip","tear","pull")
user.visible_message(\
"<span class='notice'>[user.name] [text]s at the vines.</span>",\
"<span class='notice'>You [text] at the vines.</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
return
/obj/effect/spacevine_controller
var/list/obj/effect/spacevine/vines = list()
@@ -446,18 +415,15 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_grow(src)
/obj/effect/spacevine/proc/buckle_mob()
/obj/effect/spacevine/buckle_mob()
if(!buckled_mob && prob(25))
for(var/mob/living/carbon/V in src.loc)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_buckle(src, V)
if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured
V.buckled = src
V.loc = src.loc
V.update_canmove()
src.buckled_mob = V
if((V.stat != DEAD) && (V.buckled != src)) //not dead or captured
V << "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>"
break //only capture one mob at a time.
..(V)
break //only capture one mob at a time
/obj/effect/spacevine/proc/spread()
var/direction = pick(cardinal)

View File

@@ -314,6 +314,8 @@
update_inv_wear_mask(0)
else if(I == handcuffed)
handcuffed = null
if(buckled && buckled.buckle_requires_restraints)
buckled.unbuckle_mob()
update_inv_handcuffed(0)
else if(I == legcuffed)
legcuffed = null

View File

@@ -114,7 +114,7 @@ emp_act
var/turf/picked = pick(turfs)
if(!isturf(picked)) return
if(buckled)
buckled.unbuckle()
buckled.unbuckle_mob()
src.loc = picked
return 1
return 0

View File

@@ -588,6 +588,8 @@ Sorry Giacom. Please don't be mad :(
if(C.handcuffed)
C.handcuffed.loc = C.loc
C.handcuffed = null
if(C.buckled && C.buckled.buckle_requires_restraints)
C.buckled.unbuckle_mob()
C.update_inv_handcuffed(0)
return
if(C.legcuffed)
@@ -646,13 +648,13 @@ Sorry Giacom. Please don't be mad :(
return
C.visible_message("<span class='danger'>[C] manages to unbuckle themself!</span>", \
"<span class='notice'>You successfully unbuckle yourself.</span>")
C.buckled.manual_unbuckle(C)
C.buckled.user_unbuckle_mob(C,C)
else
C << "<span class='warning'>You fail to unbuckle yourself!</span>"
else
L.buckled.manual_unbuckle(L)
L.buckled.user_unbuckle_mob(L,L)
else
L.buckled.manual_unbuckle(L)
L.buckled.user_unbuckle_mob(L,L)
//Breaking out of a container (Locker, sleeper, cryo...)
else if(loc && istype(loc, /obj) && !isturf(loc))

View File

@@ -768,11 +768,12 @@ var/list/slot_equipment_priority = list( \
if(restrained()) return 0
return 1
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
//Robots and brains have their own version so don't worry about them
/mob/proc/update_canmove()
var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH)
var/bed = !(buckled && istype(buckled, /obj/structure/stool/bed/chair))
var/buckle_lying = !(buckled && !buckled.buckle_lying)
if(ko || resting || stunned)
drop_r_hand()
drop_l_hand()
@@ -780,7 +781,7 @@ var/list/slot_equipment_priority = list( \
lying = 0
canmove = 1
if(buckled)
lying = 90 * bed
lying = 90*buckle_lying
else
if((ko || resting) && !lying)
fall(ko)
@@ -793,6 +794,7 @@ var/list/slot_equipment_priority = list( \
regenerate_icons()
return canmove
/mob/proc/fall(var/forced)
drop_l_hand()
drop_r_hand()

View File

@@ -485,6 +485,7 @@
#include "code\game\mecha\medical\odysseus.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"
#include "code\game\objects\buckling.dm"
#include "code\game\objects\empulse.dm"
#include "code\game\objects\explosion.dm"
#include "code\game\objects\items.dm"