From 262f1ea7d0b0ee20f60bbcee677181c397dbb8b5 Mon Sep 17 00:00:00 2001 From: "baloh.matevz" Date: Thu, 30 Aug 2012 05:52:22 +0000 Subject: [PATCH] - Probably not the best idea to give all players a 'kaboom' verb... We've had pens that do that before and it didn't quite work... Commented out the testing verb I left uncommented by accident. - Added basic liquid simulation code. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4586 316c924e-a436-60f5-8080-3fe189b3f50e --- code/game/objects/explosion_recursive.dm | 4 +- code/modules/liquid/splash_simulation.dm | 202 +++++++++++++++++++++++ icons/effects/liquid.dmi | Bin 0 -> 1061 bytes 3 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 code/modules/liquid/splash_simulation.dm create mode 100644 icons/effects/liquid.dmi diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 07c6241503a..4668b8bda49 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -1,8 +1,8 @@ -/* - uncomment this to test it out! */ +/* - uncomment this to test it out! /mob/verb/kaboom() var/power = input(src, "power?", "power?") as num var/turf/T = get_turf(src) - explosion_rec(T, power) + explosion_rec(T, power) */ /obj var/explosion_resistance diff --git a/code/modules/liquid/splash_simulation.dm b/code/modules/liquid/splash_simulation.dm new file mode 100644 index 00000000000..7453deac758 --- /dev/null +++ b/code/modules/liquid/splash_simulation.dm @@ -0,0 +1,202 @@ +#define LIQUID_TRANSFER_THRESHOLD 0.05 + +var/liquid_delay = 4 + +var/list/datum/puddle/puddles = list() + +datum/puddle + var/list/obj/effect/liquid/liquid_objects = list() + +datum/puddle/proc/process() + //world << "DEBUG: Puddle process!" + for(var/obj/effect/liquid/L in liquid_objects) + L.spread() + + for(var/obj/effect/liquid/L in liquid_objects) + L.apply_calculated_effect() + + if(liquid_objects.len == 0) + del(src) + +datum/puddle/New() + ..() + puddles += src + +datum/puddle/Del() + puddles -= src + for(var/obj/O in liquid_objects) + del(O) + ..() + +mob/verb/splash() + var/volume = input("Volume?","Volume?", 0 ) as num + if(!isnum(volume)) return + if(volume <= LIQUID_TRANSFER_THRESHOLD) return + var/turf/T = get_turf(src) + if(!isturf(T)) return + trigger_splash(T, volume) + +proc/trigger_splash(turf/epicenter as turf, volume as num) + if(!epicenter) + return + if(volume <= 0) + return + + var/obj/effect/liquid/L = new/obj/effect/liquid(epicenter) + L.volume = volume + L.update_icon2() + var/datum/puddle/P = new/datum/puddle() + P.liquid_objects.Add(L) + L.controller = P + + + + +obj/effect/liquid + icon = 'icons/effects/liquid.dmi' + icon_state = "0" + name = "liquid" + var/volume = 0 + var/new_volume = 0 + var/datum/puddle/controller + +obj/effect/liquid/New() + ..() + if( !isturf(loc) ) + del(src) + + for( var/obj/effect/liquid/L in loc ) + if(L != src) + del(L) + +obj/effect/liquid/proc/spread() + + //world << "DEBUG: liquid spread!" + var/surrounding_volume = 0 + var/list/spread_directions = list(1,2,4,8) + var/turf/loc_turf = loc + for(var/direction in spread_directions) + var/turf/T = get_step(src,direction) + if(!T) + spread_directions.Remove(direction) + //world << "ERROR: Map edge!" + continue //Map edge + if(!loc_turf.can_leave_liquid(direction)) //Check if this liquid can leave the tile in the direction + spread_directions.Remove(direction) + continue + if(!T.can_accept_liquid(turn(direction,180))) //Check if this liquid can enter the tile + spread_directions.Remove(direction) + continue + var/obj/effect/liquid/L = locate(/obj/effect/liquid) in T + if(L) + if(L.volume >= src.volume) + spread_directions.Remove(direction) + continue + surrounding_volume += L.volume //If liquid already exists, add it's volume to our sum + else + var/obj/effect/liquid/NL = new(T) //Otherwise create a new object which we'll spread to. + NL.controller = src.controller + controller.liquid_objects.Add(NL) + + if(!spread_directions.len) + //world << "ERROR: No candidate to spread to." + return //No suitable candidate to spread to + + var/average_volume = (src.volume + surrounding_volume) / (spread_directions.len + 1) //Average amount of volume on this and the surrounding tiles. + var/volume_difference = src.volume - average_volume //How much more/less volume this tile has than the surrounding tiles. + if(volume_difference <= (spread_directions.len*LIQUID_TRANSFER_THRESHOLD)) //If we have less than the threshold excess liquid - then there is nothing to do as other tiles will be giving us volume.or the liquid is just still. + //world << "ERROR: transfer volume lower than THRESHOLD!" + return + + var/volume_per_tile = volume_difference / spread_directions.len + + for(var/direction in spread_directions) + var/turf/T = get_step(src,direction) + if(!T) + //world << "ERROR: Map edge 2!" + continue //Map edge + var/obj/effect/liquid/L = locate(/obj/effect/liquid) in T + if(L) + src.volume -= volume_per_tile //Remove the volume from this tile + L.new_volume = L.new_volume + volume_per_tile //Add it to the volume to the other tile + +obj/effect/liquid/proc/apply_calculated_effect() + volume += new_volume + + if(volume < LIQUID_TRANSFER_THRESHOLD) + del(src) + new_volume = 0 + update_icon2() + +obj/effect/liquid/Move() + return 0 + +obj/effect/liquid/Del() + src.controller.liquid_objects.Remove(src) + ..() + +obj/effect/liquid/proc/update_icon2() + //icon_state = num2text( max(1,min(7,(floor(volume),10)/10)) ) + + switch(volume) + if(0 to 0.1) + del(src) + if(0.1 to 5) + icon_state = "1" + if(5 to 10) + icon_state = "2" + if(10 to 20) + icon_state = "3" + if(20 to 30) + icon_state = "4" + if(30 to 40) + icon_state = "5" + if(40 to 50) + icon_state = "6" + if(50 to INFINITY) + icon_state = "7" + +turf/proc/can_accept_liquid(from_direction) + return 0 +turf/proc/can_leave_liquid(from_direction) + return 0 + +turf/space/can_accept_liquid(from_direction) + return 1 +turf/space/can_leave_liquid(from_direction) + return 1 + +turf/simulated/floor/can_accept_liquid(from_direction) + for(var/obj/structure/window/W in src) + if(W.dir in list(5,6,9,10)) + return 0 + if(W.dir & from_direction) + return 0 + for(var/obj/O in src) + if(!O.liquid_pass()) + return 0 + return 1 + +turf/simulated/floor/can_leave_liquid(to_direction) + for(var/obj/structure/window/W in src) + if(W.dir in list(5,6,9,10)) + return 0 + if(W.dir & to_direction) + return 0 + for(var/obj/O in src) + if(!O.liquid_pass()) + return 0 + return 1 + +turf/simulated/wall/can_accept_liquid(from_direction) + return 0 +turf/simulated/wall/can_leave_liquid(from_direction) + return 0 + +obj/proc/liquid_pass() + return 1 + +obj/machinery/door/liquid_pass() + return !density + +#undef LIQUID_TRANSFER_THRESHOLD \ No newline at end of file diff --git a/icons/effects/liquid.dmi b/icons/effects/liquid.dmi new file mode 100644 index 0000000000000000000000000000000000000000..258a0fb2e62e5d73a290916ef66728819269dab1 GIT binary patch literal 1061 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo%~c^0B`&GO$wiq3C7Jno3=9=> zT2EPXwHS!FJ+vwpwZGN>j|6BC@iD@gcqiB4K@d%n|*yd8HfKRlH<)<1Khy7PA4 zi}C6rvlgj*{9$UTaYd9f{qMU=)`q$#ofKai3$5lC`5Ulj?D*)G^lO$glbk?-dT z_uH(m?#37V-23!<{qdS&MaB}9h8~s)6B&$z9Nd^rcrZwEDkw9ikSVx_{X_2`$uIvI z4mwk87K&3A{i<%kMf2VT8y~p* zCUKUnk3b;xzWKkLJv3>Z>e+G?sY6AK)PgI7I*m8qbtvzNm^s7py(&Qd8;Gu z0Bkt z_2+lwxYoyr&UqZN;;O-lMy9Xt9!uMOyZR%(Pbq2B%5+z|?>#|+26Nj?n2l1dH*TF; zP_M&yd&+SIMZ0+(6B}5ABv!ycd7anjUst#I%QHjlXW~ z=jSie)3&XRt+7x0tf?VBWu=L+hvUr63!dz}cuwp3`)8~@O_$iq960_gczbH*<5k-> z_*VM-=FwnX8Z%>(+KWRISsrX(;``5|`m=EY@5jWukMuNH>{fQM9~V0C(z^Yuc+!DC zcC~$`SKmLE-~ZwH@9E3==ij+}e*NR$LIR1oDoNW7F3B(ctg!u^gwpY6!51EABx$}d z42T8_U+&U!fW7e+>)kHdGYU%;x$0V2?o8@w5dkID z?JAM%bF#ZDzO#57csnDaWo|Zic}9FQ$J?fLz8rfFzX`jtbDz<@Jq<6szrGep;%@W@ pnmWT#!FYd?gxNlw3&DSwr!TW?y7Bx|GceyXc)I$ztaD0e0sz9b%QXN1 literal 0 HcmV?d00001