From dd909aa5f822f14260b24a3f7415854f48f8df80 Mon Sep 17 00:00:00 2001 From: "petethegoat@gmail.com" Date: Fri, 30 Nov 2012 22:37:00 +0000 Subject: [PATCH] Added an upgraded mopbucket for the janitor and placed it on the map. Updated the changelog. Moved Agouri's vehicle code into his dm in unused. Moved the vehicle dmi into icons/obj. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5234 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/janicart.dm | 114 ++++++ code/game/jobs/job/civilian.dm | 1 + code/game/objects/structures/mop_bucket.dm | 1 - .../structures/stool_bed_chair_nest/chairs.dm | 6 + code/game/vehicles/airtight/airtight.dm | 165 -------- code/game/vehicles/airtight/land.dm | 0 code/game/vehicles/airtight/space.dm | 0 code/game/vehicles/vehicle.dm | 190 --------- code/modules/mob/mob_movement.dm | 4 + code/unused/Agouri_stuff.dm | 384 ++++++++++++++++++ html/changelog.html | 8 + icons/obj/janitor.dmi | Bin 4356 -> 1146 bytes icons/obj/vehicles.dmi | Bin 0 -> 11038 bytes icons/vehicles/vehicles.dmi | Bin 11735 -> 0 bytes maps/tgstation.2.0.9.dmm | 4 +- tgstation.dme | 5 +- 16 files changed, 520 insertions(+), 362 deletions(-) create mode 100644 code/defines/janicart.dm delete mode 100644 code/game/vehicles/airtight/airtight.dm delete mode 100644 code/game/vehicles/airtight/land.dm delete mode 100644 code/game/vehicles/airtight/space.dm delete mode 100644 code/game/vehicles/vehicle.dm create mode 100644 icons/obj/vehicles.dmi delete mode 100644 icons/vehicles/vehicles.dmi diff --git a/code/defines/janicart.dm b/code/defines/janicart.dm new file mode 100644 index 00000000000..ffa4840793d --- /dev/null +++ b/code/defines/janicart.dm @@ -0,0 +1,114 @@ +/obj/structure/stool/bed/chair/janicart + name = "janicart" + icon = 'icons/obj/vehicles.dmi' + icon_state = "pussywagon" + anchored = 1 + density = 1 + flags = OPENCONTAINER + //copypaste sorry + var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite + +/obj/structure/stool/bed/chair/janicart/New() + handle_rotation() + + var/datum/reagents/R = new/datum/reagents(100) + reagents = R + R.my_atom = src + + +/obj/structure/stool/bed/chair/janicart/examine() + set src in usr + usr << "\icon[src] This pimpin' ride contains [reagents.total_volume] unit\s of water!" + +/obj/structure/stool/bed/chair/janicart/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/mop)) + if(reagents.total_volume >= 2) + reagents.trans_to(W, 2) + user << "You wet the mop in the pimpin' ride." + playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) + if(reagents.total_volume < 1) + user << "This pimpin' ride is out of water!" + else if(istype(W, /obj/item/key)) + user << "Hold [I] in one of your hands while you drive this pimpin' ride." + return + +/obj/structure/stool/bed/chair/janicart/relaymove(mob/user, direction) + if(istype(user.l_hand, /obj/item/key) || istype(user.r_hand, /obj/item/key)) + step(src, direction) + update_mob() + handle_rotation() + else + user << "You'll need the keys to drive this pimpin' ride." + +/obj/structure/stool/bed/chair/janicart/Move() + ..() + if(buckled_mob) + if(buckled_mob.buckled == src) + buckled_mob.loc = loc + +/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(\ + "[M] climbs onto [src]!",\ + "You climb onto [src]!") + M.buckled = src + M.loc = loc + M.dir = dir + M.update_canmove() + buckled_mob = 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/handle_rotation() + if(dir == SOUTH) + layer = FLY_LAYER + else + layer = OBJ_LAYER + + if(buckled_mob) + if(buckled_mob.loc != loc) + buckled_mob.buckled = null //Temporary, so Move() succeeds. + buckled_mob.buckled = src //Restoring + + update_mob() + +/obj/structure/stool/bed/chair/janicart/proc/update_mob() + if(buckled_mob) + buckled_mob.dir = dir + switch(dir) + if(SOUTH) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 7 + if(WEST) + buckled_mob.pixel_x = 13 + buckled_mob.pixel_y = 7 + if(NORTH) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 4 + if(EAST) + buckled_mob.pixel_x = -13 + buckled_mob.pixel_y = 7 + +/obj/structure/stool/bed/chair/janicart/bullet_act(var/obj/item/projectile/Proj) + if(buckled_mob) + if(prob(50)) + return buckled_mob.bullet_act(Proj) + visible_message("[Proj] ricochets off the pimpin' ride!") + +/obj/item/key + name = "key" + desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." + icon = 'icons/obj/vehicles.dmi' + icon_state = "keys" + w_class = 1 \ No newline at end of file diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 6aa702f1729..76cb70d69b7 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -246,6 +246,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/key(H), slot_l_store) return 1 diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index b59e3a28768..db0c54a8204 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/janitor.dmi' icon_state = "mopbucket" density = 1 - flags = FPRINT pressure_resistance = ONE_ATMOSPHERE flags = FPRINT | TABLEPASS | OPENCONTAINER var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 447913d225b..d9cf83ed9bf 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -98,6 +98,12 @@ /obj/structure/stool/bed/chair/office anchored = 0 +/obj/structure/stool/bed/chair/office/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/weldingtool)) + icon = 'icons/obj/joustchair.dmi' + pixel_x = -16 + pixel_y = -16 + /obj/structure/stool/bed/chair/comfy/black icon_state = "comfychair_black" diff --git a/code/game/vehicles/airtight/airtight.dm b/code/game/vehicles/airtight/airtight.dm deleted file mode 100644 index cd589948fc6..00000000000 --- a/code/game/vehicles/airtight/airtight.dm +++ /dev/null @@ -1,165 +0,0 @@ - -/obj/vehicle/airtight - //inner atmos - var/use_internal_tank = 0 - var/internal_tank_valve = ONE_ATMOSPHERE - var/obj/machinery/portable_atmospherics/canister/internal_tank - var/datum/gas_mixture/cabin_air - var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature - var/datum/global_iterator/pr_give_air //moves air from tank to cabin - - -/obj/vehicle/airtight/New() - ..() - src.add_airtank() - src.add_cabin() - src.add_airtight_iterators() - - - - -//######################################### Helpers for airtight vehicles ######################################### - -/obj/vehicle/airtight/proc/add_cabin() - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air - -/obj/vehicle/airtight/proc/add_airtank() - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank - -/obj/vehicle/airtight/proc/add_airtight_iterators() - pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) - pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src)) - - -//######################################### Specific datums for airtight vehicles ################################# - - -/datum/global_iterator/vehicle_preserve_temp //normalizing cabin air temperature to 20 degrees celsium - delay = 20 - - process(var/obj/vehicle/airtight/V) - if(V.cabin_air && V.cabin_air.return_volume() > 0) - var/delta = V.cabin_air.temperature - T20C - V.cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1))) - return - - -/datum/global_iterator/vehicle_tank_give_air - delay = 15 - - process(var/obj/vehicle/airtight/V) - if(V.internal_tank) - var/datum/gas_mixture/tank_air = V.internal_tank.return_air() - var/datum/gas_mixture/cabin_air = V.cabin_air - - var/release_pressure = V.internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.return_temperature() > 0) - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = V.get_turf_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - del(removed) - else - return stop() - return - - -//######################################### Atmospherics for vehicles ############################################# - - -/obj/vehicle/proc/get_turf_air() - var/turf/T = get_turf(src) - if(T) - . = T.return_air() - return - -/obj/vehicle/airtight/remove_air(amount) - if(use_internal_tank) - return cabin_air.remove(amount) - else - var/turf/T = get_turf(src) - if(T) - return T.remove_air(amount) - return - -/obj/vehicle/airtight/return_air() - if(use_internal_tank) - return cabin_air - return get_turf_air() - -/obj/vehicle/airtight/proc/return_pressure() - . = 0 - if(use_internal_tank) - . = cabin_air.return_pressure() - else - var/datum/gas_mixture/t_air = get_turf_air() - if(t_air) - . = t_air.return_pressure() - return - - -/obj/vehicle/airtight/proc/return_temperature() - . = 0 - if(use_internal_tank) - . = cabin_air.return_temperature() - else - var/datum/gas_mixture/t_air = get_turf_air() - if(t_air) - . = t_air.return_temperature() - return - -/obj/vehicle/airtight/proc/connect(obj/machinery/atmospherics/portables_connector/new_port) - //Make sure not already connected to something else - if(connected_port || !new_port || new_port.connected_device) - return 0 - - //Make sure are close enough for a valid connection - if(new_port.loc != src.loc) - return 0 - - //Perform the connection - connected_port = new_port - connected_port.connected_device = src - - //Actually enforce the air sharing - var/datum/pipe_network/network = connected_port.return_network(src) - if(network && !(internal_tank.return_air() in network.gases)) - network.gases += internal_tank.return_air() - network.update = 1 - log_message("Vehicle airtank connected to external port.") - return 1 - -/obj/vehicle/airtight/proc/disconnect() - if(!connected_port) - return 0 - - var/datum/pipe_network/network = connected_port.return_network(src) - if(network) - network.gases -= internal_tank.return_air() - - connected_port.connected_device = null - connected_port = null - src.log_message("Vehicle airtank disconnected from external port.") - return 1 \ No newline at end of file diff --git a/code/game/vehicles/airtight/land.dm b/code/game/vehicles/airtight/land.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/game/vehicles/airtight/space.dm b/code/game/vehicles/airtight/space.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/game/vehicles/vehicle.dm b/code/game/vehicles/vehicle.dm deleted file mode 100644 index b41afba6cb1..00000000000 --- a/code/game/vehicles/vehicle.dm +++ /dev/null @@ -1,190 +0,0 @@ - - -/obj/vehicle - name = "Vehicle" - icon = 'icons/vehicles/vehicles.dmi' - density = 1 - anchored = 1 - unacidable = 1 //To avoid the pilot-deleting shit that came with mechas - layer = MOB_LAYER - //var/can_move = 1 - var/mob/living/carbon/occupant = null - //var/step_in = 10 //make a step in step_in/10 sec. - //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. - //var/step_energy_drain = 10 - var/health = 300 //health is health - //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. - //the values in this list show how much damage will pass through, not how much will be absorbed. - var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) - var/obj/item/weapon/cell/cell //Our power source - var/state = 0 - var/list/log = new - var/last_message = 0 - var/add_req_access = 1 - var/maint_access = 1 - //var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference - var/datum/effect/effect/system/spark_spread/spark_system = new - var/lights = 0 - var/lights_power = 6 - - //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri - //var/use_internal_tank = 0 - //var/internal_tank_valve = ONE_ATMOSPHERE - //var/obj/machinery/portable_atmospherics/canister/internal_tank - //var/datum/gas_mixture/cabin_air - //var/obj/machinery/atmospherics/portables_connector/connected_port = null - - var/obj/item/device/radio/radio = null - - var/max_temperature = 2500 - //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible - var/internal_damage = 0 //contains bitflags - - var/list/operation_req_access = list()//required access level for mecha operation - var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment - - //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri - var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss - - //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri - - var/datum/global_iterator/pr_internal_damage //processes internal damage - - - var/wreckage - - var/list/equipment = new - var/obj/selected - //var/max_equip = 3 - - var/datum/events/events - - - -/obj/vehicle/New() - ..() - events = new - icon_state += "-unmanned" - add_radio() - //add_cabin() //No cabin for non-airtights - - spark_system.set_up(2, 0, src) - spark_system.attach(src) - add_cell() - add_iterators() - removeVerb(/obj/mecha/verb/disconnect_from_port) - removeVerb(/atom/movable/verb/pull) - log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") - loc.Entered(src) - return - - -//################ Helpers ########################################################### - - -/obj/vehicle/proc/removeVerb(verb_path) - verbs -= verb_path - -/obj/vehicle/proc/addVerb(verb_path) - verbs += verb_path - -/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri - internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) - return internal_tank*/ - -/obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 15000 - cell.maxcharge = 15000 - -/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri - cabin_air = new - cabin_air.temperature = T20C - cabin_air.volume = 200 - cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - return cabin_air*/ - -/obj/vehicle/proc/add_radio() - radio = new(src) - radio.name = "[src] radio" - radio.icon = icon - radio.icon_state = icon_state - radio.subspace_transmission = 1 - -/obj/vehicle/proc/add_iterators() - pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) - //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) - //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri - //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri - -/obj/vehicle/proc/check_for_support() - if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) - return 1 - else - return 0 - -//################ Logs and messages ############################################ - - -/obj/vehicle/proc/log_message(message as text,red=null) - log.len++ - log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") - return log.len - - - -//################ Global Iterator Datums ###################################### - - -/datum/global_iterator/vehicle_intertial_movement //inertial movement in space - delay = 7 - - process(var/obj/vehicle/V as obj, direction) - if(direction) - if(!step(V, direction)||V.check_for_support()) - src.stop() - else - src.stop() - return - - -/datum/global_iterator/mecha_internal_damage // processing internal damage - - process(var/obj/mecha/mecha) - if(!mecha.hasInternalDamage()) - return stop() - if(mecha.hasInternalDamage(MECHA_INT_FIRE)) - if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) - mecha.clearInternalDamage(MECHA_INT_FIRE) - if(mecha.internal_tank) - if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) - mecha.setInternalDamage(MECHA_INT_TANK_BREACH) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) - if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) - mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) - if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) - mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") - if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum - mecha.pr_int_temp_processor.stop() - if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank - if(mecha.internal_tank) - var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) - if(mecha.loc && hascall(mecha.loc,"assume_air")) - mecha.loc.assume_air(leaked_gas) - else - del(leaked_gas) - if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) - if(mecha.get_charge()) - mecha.spark_system.start() - mecha.cell.charge -= min(20,mecha.cell.charge) - mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) - return \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index ad32d6b3cbe..c88c52c4957 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -250,6 +250,10 @@ return if(Process_Grab()) return + + if(mob.buckled) //if we're buckled to something, tell it we moved. + return mob.buckled.relaymove(mob, direct) + if(!mob.canmove) return diff --git a/code/unused/Agouri_stuff.dm b/code/unused/Agouri_stuff.dm index ae172fc1a09..de3fa1a031e 100644 --- a/code/unused/Agouri_stuff.dm +++ b/code/unused/Agouri_stuff.dm @@ -1,3 +1,387 @@ +/* +/obj/vehicle/airtight + //inner atmos + var/use_internal_tank = 0 + var/internal_tank_valve = ONE_ATMOSPHERE + var/obj/machinery/portable_atmospherics/canister/internal_tank + var/datum/gas_mixture/cabin_air + var/obj/machinery/atmospherics/portables_connector/connected_port = null + + var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature + var/datum/global_iterator/pr_give_air //moves air from tank to cabin + + +/obj/vehicle/airtight/New() + ..() + src.add_airtank() + src.add_cabin() + src.add_airtight_iterators() + + + + +//######################################### Helpers for airtight vehicles ######################################### + +/obj/vehicle/airtight/proc/add_cabin() + cabin_air = new + cabin_air.temperature = T20C + cabin_air.volume = 200 + cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + return cabin_air + +/obj/vehicle/airtight/proc/add_airtank() + internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) + return internal_tank + +/obj/vehicle/airtight/proc/add_airtight_iterators() + pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) + pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src)) + + +//######################################### Specific datums for airtight vehicles ################################# + + +/datum/global_iterator/vehicle_preserve_temp //normalizing cabin air temperature to 20 degrees celsium + delay = 20 + + process(var/obj/vehicle/airtight/V) + if(V.cabin_air && V.cabin_air.return_volume() > 0) + var/delta = V.cabin_air.temperature - T20C + V.cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1))) + return + + +/datum/global_iterator/vehicle_tank_give_air + delay = 15 + + process(var/obj/vehicle/airtight/V) + if(V.internal_tank) + var/datum/gas_mixture/tank_air = V.internal_tank.return_air() + var/datum/gas_mixture/cabin_air = V.cabin_air + + var/release_pressure = V.internal_tank_valve + var/cabin_pressure = cabin_air.return_pressure() + var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) + var/transfer_moles = 0 + if(pressure_delta > 0) //cabin pressure lower than release pressure + if(tank_air.return_temperature() > 0) + transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) + cabin_air.merge(removed) + else if(pressure_delta < 0) //cabin pressure higher than release pressure + var/datum/gas_mixture/t_air = V.get_turf_air() + pressure_delta = cabin_pressure - release_pressure + if(t_air) + pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) + if(pressure_delta > 0) //if location pressure is lower than cabin pressure + transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) + var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) + if(t_air) + t_air.merge(removed) + else //just delete the cabin gas, we're in space or some shit + del(removed) + else + return stop() + return + + +//######################################### Atmospherics for vehicles ############################################# + + +/obj/vehicle/proc/get_turf_air() + var/turf/T = get_turf(src) + if(T) + . = T.return_air() + return + +/obj/vehicle/airtight/remove_air(amount) + if(use_internal_tank) + return cabin_air.remove(amount) + else + var/turf/T = get_turf(src) + if(T) + return T.remove_air(amount) + return + +/obj/vehicle/airtight/return_air() + if(use_internal_tank) + return cabin_air + return get_turf_air() + +/obj/vehicle/airtight/proc/return_pressure() + . = 0 + if(use_internal_tank) + . = cabin_air.return_pressure() + else + var/datum/gas_mixture/t_air = get_turf_air() + if(t_air) + . = t_air.return_pressure() + return + + +/obj/vehicle/airtight/proc/return_temperature() + . = 0 + if(use_internal_tank) + . = cabin_air.return_temperature() + else + var/datum/gas_mixture/t_air = get_turf_air() + if(t_air) + . = t_air.return_temperature() + return + +/obj/vehicle/airtight/proc/connect(obj/machinery/atmospherics/portables_connector/new_port) + //Make sure not already connected to something else + if(connected_port || !new_port || new_port.connected_device) + return 0 + + //Make sure are close enough for a valid connection + if(new_port.loc != src.loc) + return 0 + + //Perform the connection + connected_port = new_port + connected_port.connected_device = src + + //Actually enforce the air sharing + var/datum/pipe_network/network = connected_port.return_network(src) + if(network && !(internal_tank.return_air() in network.gases)) + network.gases += internal_tank.return_air() + network.update = 1 + log_message("Vehicle airtank connected to external port.") + return 1 + +/obj/vehicle/airtight/proc/disconnect() + if(!connected_port) + return 0 + + var/datum/pipe_network/network = connected_port.return_network(src) + if(network) + network.gases -= internal_tank.return_air() + + connected_port.connected_device = null + connected_port = null + src.log_message("Vehicle airtank disconnected from external port.") + return 1 + + + + +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// + + + +/obj/vehicle + name = "Vehicle" + icon = 'icons/vehicles/vehicles.dmi' + density = 1 + anchored = 1 + unacidable = 1 //To avoid the pilot-deleting shit that came with mechas + layer = MOB_LAYER + //var/can_move = 1 + var/mob/living/carbon/occupant = null + //var/step_in = 10 //make a step in step_in/10 sec. + //var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. + //var/step_energy_drain = 10 + var/health = 300 //health is health + //var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. + //the values in this list show how much damage will pass through, not how much will be absorbed. + var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) + var/obj/item/weapon/cell/cell //Our power source + var/state = 0 + var/list/log = new + var/last_message = 0 + var/add_req_access = 1 + var/maint_access = 1 + //var/dna //dna-locking the mech + var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference + var/datum/effect/effect/system/spark_spread/spark_system = new + var/lights = 0 + var/lights_power = 6 + + //inner atmos //These go in airtight.dm, not all vehicles are space-faring -Agouri + //var/use_internal_tank = 0 + //var/internal_tank_valve = ONE_ATMOSPHERE + //var/obj/machinery/portable_atmospherics/canister/internal_tank + //var/datum/gas_mixture/cabin_air + //var/obj/machinery/atmospherics/portables_connector/connected_port = null + + var/obj/item/device/radio/radio = null + + var/max_temperature = 2500 + //var/internal_damage_threshold = 50 //health percentage below which internal damage is possible + var/internal_damage = 0 //contains bitflags + + var/list/operation_req_access = list()//required access level for mecha operation + var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment + + //var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri + var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss + + //var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri + + var/datum/global_iterator/pr_internal_damage //processes internal damage + + + var/wreckage + + var/list/equipment = new + var/obj/selected + //var/max_equip = 3 + + var/datum/events/events + + + +/obj/vehicle/New() + ..() + events = new + icon_state += "-unmanned" + add_radio() + //add_cabin() //No cabin for non-airtights + + spark_system.set_up(2, 0, src) + spark_system.attach(src) + add_cell() + add_iterators() + removeVerb(/obj/mecha/verb/disconnect_from_port) + removeVerb(/atom/movable/verb/pull) + log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") + loc.Entered(src) + return + + +//################ Helpers ########################################################### + + +/obj/vehicle/proc/removeVerb(verb_path) + verbs -= verb_path + +/obj/vehicle/proc/addVerb(verb_path) + verbs += verb_path + +/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri + internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) + return internal_tank*/ + +/obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null) + if(C) + C.forceMove(src) + cell = C + return + cell = new(src) + cell.charge = 15000 + cell.maxcharge = 15000 + +/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri + cabin_air = new + cabin_air.temperature = T20C + cabin_air.volume = 200 + cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) + return cabin_air*/ + +/obj/vehicle/proc/add_radio() + radio = new(src) + radio.name = "[src] radio" + radio.icon = icon + radio.icon_state = icon_state + radio.subspace_transmission = 1 + +/obj/vehicle/proc/add_iterators() + pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0) + //pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0) + //pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri + //pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri + +/obj/vehicle/proc/check_for_support() + if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) + return 1 + else + return 0 + +//################ Logs and messages ############################################ + + +/obj/vehicle/proc/log_message(message as text,red=null) + log.len++ + log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]") + return log.len + + + +//################ Global Iterator Datums ###################################### + + +/datum/global_iterator/vehicle_intertial_movement //inertial movement in space + delay = 7 + + process(var/obj/vehicle/V as obj, direction) + if(direction) + if(!step(V, direction)||V.check_for_support()) + src.stop() + else + src.stop() + return + + +/datum/global_iterator/mecha_internal_damage // processing internal damage + + process(var/obj/mecha/mecha) + if(!mecha.hasInternalDamage()) + return stop() + if(mecha.hasInternalDamage(MECHA_INT_FIRE)) + if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5)) + mecha.clearInternalDamage(MECHA_INT_FIRE) + if(mecha.internal_tank) + if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH))) + mecha.setInternalDamage(MECHA_INT_TANK_BREACH) + var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() + if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents + int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15)) + if(mecha.cabin_air && mecha.cabin_air.return_volume()>0) + mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15)) + if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2) + mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire") + if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum + mecha.pr_int_temp_processor.stop() + if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank + if(mecha.internal_tank) + var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air() + var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10) + if(mecha.loc && hascall(mecha.loc,"assume_air")) + mecha.loc.assume_air(leaked_gas) + else + del(leaked_gas) + if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) + if(mecha.get_charge()) + mecha.spark_system.start() + mecha.cell.charge -= min(20,mecha.cell.charge) + mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge) + return + + +*/ + + + + + +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// +///////////////////////////////////////////////////////// + + + + /*/turf/DblClick() if(istype(usr, /mob/living/silicon/ai)) return move_camera_by_click() diff --git a/html/changelog.html b/html/changelog.html index c0dd6320a88..2054d50b6a0 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -48,6 +48,14 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit tho. Thanks. --> +
+

30 November 2012

+

Petethegoat updated:

+ +
+

28 November 2012

Kor updated:

diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 0971ee425f26275920d3a73ded1294e07f94e42a..5e0e2ced3aea6a9d95cccd5e785a8fe9e538e3f8 100644 GIT binary patch delta 1136 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 literal 0 HcmV?d00001 diff --git a/icons/vehicles/vehicles.dmi b/icons/vehicles/vehicles.dmi deleted file mode 100644 index 5650366b18ed4393606ca2c2a5faeb6e4574b0c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11735 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 b9>7vVBWv%MC`N-jwE=w{Bkf8}$0z>