diff --git a/code/ATMOSPHERICS/components/filter.dm b/code/ATMOSPHERICS/components/filter.dm index 8ecddc73847..05652a9350a 100644 --- a/code/ATMOSPHERICS/components/filter.dm +++ b/code/ATMOSPHERICS/components/filter.dm @@ -29,10 +29,12 @@ obj/machinery/atmospherics/filter var/filter_type = 0 /* Filter types: -0: Carbon Molecules: Plasma Toxin, Carbon Dioxide, Oxygen Agent B -1: Oxygen: Oxygen ONLY -2: Nitrogen: Nitrogen and Sleeping Agent -3: Carbon Dioxide: Carbon Dioxide ONLY +-1: Nothing + 0: Carbon Molecules: Plasma Toxin, Oxygen Agent B + 1: Oxygen: Oxygen ONLY + 2: Nitrogen: Nitrogen ONLY + 3: Carbon Dioxide: Carbon Dioxide ONLY + 4: Sleeping Agent (N2O) */ var/frequency = 0 diff --git a/code/WorkInProgress/Chemistry-Machinery.dm b/code/WorkInProgress/Chemistry-Machinery.dm index 05775e5dd8c..299ea2dfb1d 100644 --- a/code/WorkInProgress/Chemistry-Machinery.dm +++ b/code/WorkInProgress/Chemistry-Machinery.dm @@ -385,7 +385,7 @@ dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker":"")]
" dat += "Close" - user << browse("PanD.E.M.I.C 2200
[dat]", "window=pandemic;size=575x400") + user << browse("[src.name]
[dat]", "window=pandemic;size=575x400") onclose(user, "pandemic") return diff --git a/code/datums/disease.dm b/code/datums/disease.dm index 81ecdcb5f4d..19dae7fb857 100644 --- a/code/datums/disease.dm +++ b/code/datums/disease.dm @@ -24,8 +24,8 @@ to null does not delete the object itself. Thank you. var/spread_type = AIRBORNE var/contagious_period = 0//the disease stage when it can be spread var/list/affected_species = list() - var/mob/affected_mob = null - var/holder = null + var/mob/affected_mob = null //the mob which is affected by disease. + var/holder = null //the atom containing the disease (mob or obj) var/carrier = 0.0 //there will be a small chance that the person will be a carrier var/curable = 1 //can this disease be cured? (By itself...) var/list/strain_data = list() //This is passed on to infectees @@ -34,6 +34,7 @@ to null does not delete the object itself. Thank you. var/permeability_mod = 1//permeability modifier coefficient. var/desc = null//description. Leave it null and this disease won't show in med records. var/severity = null//severity descr + var/longevity = 250//time in "ticks" the virus stays in inanimate object (blood stains, corpses, etc). In syringes, bottles and beakers it stays infinitely. /datum/disease/proc/stage_act() var/cure_present = has_cure() @@ -71,6 +72,8 @@ to null does not delete the object itself. Thank you. /mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1) // world << "Contract_disease called by [src] with virus [virus]" + if(src.stat >=2) return + if(force_species_check) var/fail = 1 @@ -98,6 +101,7 @@ to null does not delete the object itself. Thank you. if(prob(99.9)) return src.resistances.Remove(virus.type)//the resistance is futile + /* var/list/clothing_areas = list() var/list/covers = list(UPPER_TORSO,LOWER_TORSO,LEGS,FEET,ARMS,HANDS) @@ -276,8 +280,17 @@ to null does not delete the object itself. Thank you. if(!src.holder) return if(prob(40)) src.spread(holder) - if(src.holder == src.affected_mob && affected_mob.stat < 2) - src.stage_act() + if(src.holder == src.affected_mob) + if(affected_mob.stat < 2) //he's alive + src.stage_act() + else //he's dead. + if(src.spread_type!=SPECIAL) + src.spread_type = CONTACT_GENERAL + src.affected_mob = null + if(!src.affected_mob) //the virus is in inanimate obj +// world << "[src] longevity = [src.longevity]" + if(--src.longevity<=0) + src.cure(0) return /datum/disease/proc/cure(var/resistance=1)//if resistance = 0, the mob won't develop resistance to disease @@ -291,8 +304,8 @@ to null does not delete the object itself. Thank you. return -/datum/disease/New(var/process=1)//adding the object to global list. List is processed by master controller. - if(process) +/datum/disease/New(var/process=1)//process = 1 - adding the object to global list. List is processed by master controller. + if(process) // Viruses in list are considered active. active_diseases += src /* diff --git a/code/defines/obj/clothing.dm b/code/defines/obj/clothing.dm index f81dd57438c..1afec170ce4 100644 --- a/code/defines/obj/clothing.dm +++ b/code/defines/obj/clothing.dm @@ -440,12 +440,15 @@ name = "galoshes" icon_state = "galoshes" permeability_coefficient = 0.05 + flags = NOSLIP /obj/item/clothing/shoes/magboots desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle." name = "magboots" - icon_state = "magboots" + icon_state = "magboots0" protective_temperature = 800 + heat_transfer_coefficient = 0.01 +// flags = NOSLIP //disabled by default /obj/item/clothing/shoes/clown_shoes desc = "Damn, thems some big shoes." diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 66af86d1b53..4b4f3fe6699 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -265,12 +265,14 @@ D.strain_data["UI"] = H.dna.uni_identity D.strain_data["SE"] = H.dna.struc_enzymes D.carrier = 1 + D.holder = H D.affected_mob = H H.virus = D break else H.virus = new virus_type H.virus.affected_mob = H + H.virus.holder = H H.virus.carrier = 1 break diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 9a7f2865ea6..c6352856b0d 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -24,41 +24,46 @@ /proc/spawn_meteor() - AGAIN - var/startside = pick(cardinal) var/startx var/starty var/endx var/endy + var/turf/pickedstart + var/turf/pickedgoal + var/max_i = 10//number of tries to spawn meteor. - switch(startside) - if(NORTH) - starty = world.maxy-1 - startx = rand(1, world.maxx-1) - endy = 1 - endx = rand(1, world.maxx-1) - if(EAST) - starty = rand(1,world.maxy-1) - startx = world.maxx-1 - endy = rand(1, world.maxy-1) - endx = 1 - if(SOUTH) - starty = 1 - startx = rand(1, world.maxx-1) - endy = world.maxy-1 - endx = rand(1, world.maxx-1) - if(WEST) - starty = rand(1, world.maxy-1) - startx = 1 - endy = rand(1,world.maxy-1) - endx = world.maxx-1 - var/turf/pickedstart = locate(startx, starty, 1) - var/turf/pickedgoal = locate(endx, endy, 1) + do + switch(startside) + if(NORTH) + starty = world.maxy-1 + startx = rand(1, world.maxx-1) + endy = 1 + endx = rand(1, world.maxx-1) + if(EAST) + starty = rand(1,world.maxy-1) + startx = world.maxx-1 + endy = rand(1, world.maxy-1) + endx = 1 + if(SOUTH) + starty = 1 + startx = rand(1, world.maxx-1) + endy = world.maxy-1 + endx = rand(1, world.maxx-1) + if(WEST) + starty = rand(1, world.maxy-1) + startx = 1 + endy = rand(1,world.maxy-1) + endx = world.maxx-1 + + pickedstart = locate(startx, starty, 1) + pickedgoal = locate(endx, endy, 1) + max_i-- + if(max_i<=0) return + + while (!istype(pickedstart, /turf/space) || locate(/obj/shield in pickedstart) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen. - if (!istype(pickedstart, /turf/space) || locate(/obj/shield in pickedstart) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen. - goto AGAIN var/obj/meteor/M if(rand(50)) @@ -67,7 +72,10 @@ M = new /obj/meteor/small( pickedstart ) M.dest = pickedgoal - walk_towards(M, M.dest, 1) + spawn(0) + walk_towards(M, M.dest, 1) + + return /obj/meteor name = "meteor" @@ -91,7 +99,7 @@ /obj/meteor/Bump(atom/A) spawn(0) - for(var/mob/M in view(A, null)) + for(var/mob/M in range(10, src)) if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view shake_camera(M, 3, 1) if (A) @@ -99,7 +107,7 @@ playsound(src.loc, 'meteorimpact.ogg', 40, 1) if (--src.hits <= 0) if(prob(15) && !istype(A, /obj/grille)) - explosion(loc, 0, 1, 2, 3) + explosion(src.loc, 0, 1, 2, 3) playsound(src.loc, "explosion", 50, 1) del(src) return diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/alien/facehugger.dm index 271214da067..2a823ed392e 100644 --- a/code/game/objects/alien/facehugger.dm +++ b/code/game/objects/alien/facehugger.dm @@ -247,6 +247,8 @@ target.alien_egg_flag = 1 var/mob/trg = target src.death() + if(trg.virus) + trg.virus.cure(0) trg.contract_disease(new /datum/disease/alien_embryo(0)) return else diff --git a/code/game/objects/devices/PDA.dm b/code/game/objects/devices/PDA.dm index 5007ca9f27d..a4fac35c25c 100644 --- a/code/game/objects/devices/PDA.dm +++ b/code/game/objects/devices/PDA.dm @@ -1477,7 +1477,7 @@ Code: /obj/item/device/pda/clown/HasEntered(AM as mob|obj) //Clown PDA is slippery. if (istype(AM, /mob/living/carbon)) var/mob/M = AM - if ((istype(M, /mob/living/carbon/human) && istype(M:shoes, /obj/item/clothing/shoes/galoshes)) || M.m_intent == "walk") + if ((istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) || M.m_intent == "walk") return if ((istype(M, /mob/living/carbon/human) && (M.real_name != src.owner) && (istype(src.cartridge, /obj/item/weapon/cartridge/clown)))) diff --git a/code/game/objects/effect_system.dm b/code/game/objects/effect_system.dm index 299a69dec30..88937afd7d6 100644 --- a/code/game/objects/effect_system.dm +++ b/code/game/objects/effect_system.dm @@ -681,7 +681,7 @@ steam.start() -- spawns the effect if (istype(AM, /mob/living/carbon)) var/mob/M = AM - if ((istype(M, /mob/living/carbon/human) && istype(M:shoes, /obj/item/clothing/shoes/galoshes))) + if (istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) return M.pulling = null diff --git a/code/game/objects/items/clothing.dm b/code/game/objects/items/clothing.dm index 66746c54d5d..45206aec3f6 100644 --- a/code/game/objects/items/clothing.dm +++ b/code/game/objects/items/clothing.dm @@ -306,4 +306,22 @@ DEATH COMMANDO GAS MASK /obj/item/clothing/under/color/orange/mode = 3 /obj/item/clothing/under/color/orange/attack_self(mob/user as mob) - user << "There are no controls for the sensing equipment woven into the fabric." \ No newline at end of file + user << "There are no controls for the sensing equipment woven into the fabric." + + +/obj/item/clothing/shoes/magboots/attack_self(mob/user as mob) + if(src.flags&NOSLIP) + src.flags &= ~NOSLIP + icon_state = "magboots0" + user << "You disable the mag-pulse traction system." + else + src.flags |= NOSLIP + icon_state = "magboots1" + user << "You enable the mag-pulse traction system." + +/obj/item/clothing/shoes/magboots/examine() + ..() + var/state = "disabled" + if(src.flags&NOSLIP) + state = "enabled" + usr << "Its mag-pulse traction system appears to be [state]." \ No newline at end of file diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index bb0c3e4f9e8..f08d08478a3 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -21,7 +21,7 @@ BIKE HORN /obj/item/weapon/bananapeel/HasEntered(AM as mob|obj) if (istype(AM, /mob/living/carbon)) var/mob/M = AM - if ((istype(M, /mob/living/carbon/human) && istype(M:shoes, /obj/item/clothing/shoes/galoshes))) + if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP)) return M.pulling = null diff --git a/code/game/turf.dm b/code/game/turf.dm index e0b880a8550..5054622b0bc 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -152,7 +152,7 @@ switch (src.wet) if(1) if (istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes - if ((M.m_intent == "run") && (!istype(M:shoes, /obj/item/clothing/shoes/galoshes))) + if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) M.pulling = null step(M, M.dir) M << "\blue You slipped on the wet floor!" @@ -718,32 +718,44 @@ turf/simulated/floor/proc/update_icon() // if (locate(/obj/movable, src)) // return 1 - if ((istype(A, /mob/) && src.x > 2 && src.x < (world.maxx - 1))) + if ((istype(A, /mob/) && src.x > 2 && src.x < (world.maxx - 1) && src.y > 2 && src.y < (world.maxy-1))) var/mob/M = A if ((!( M.handcuffed) && M.canmove)) var/prob_slip = 5 + var/mag_eq = 0 + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && H.shoes.flags&NOSLIP) + mag_eq = 1 if (locate(/obj/grille, oview(1, M)) || locate(/obj/lattice, oview(1, M)) ) - if (!( M.l_hand )) - prob_slip -= 2 - else if (M.l_hand.w_class <= 2) - prob_slip -= 1 + if(mag_eq) + prob_slip = 0 + else + if (!( M.l_hand )) + prob_slip -= 2 + else if (M.l_hand.w_class <= 2) + prob_slip -= 1 - if (!( M.r_hand )) - prob_slip -= 2 - else if (M.r_hand.w_class <= 2) - prob_slip -= 1 + if (!( M.r_hand )) + prob_slip -= 2 + else if (M.r_hand.w_class <= 2) + prob_slip -= 1 else if (locate(/turf/unsimulated, oview(1, M)) || locate(/turf/simulated, oview(1, M))) - if (!( M.l_hand )) - prob_slip -= 1 - else if (M.l_hand.w_class <= 2) - prob_slip -= 0.5 + if(mag_eq) + prob_slip = 0 + else + if (!( M.l_hand )) + prob_slip -= 1 + else if (M.l_hand.w_class <= 2) + prob_slip -= 0.5 - if (!( M.r_hand )) - prob_slip -= 1 - else if (M.r_hand.w_class <= 2) - prob_slip -= 0.5 + if (!( M.r_hand )) + prob_slip -= 1 + else if (M.r_hand.w_class <= 2) + prob_slip -= 0.5 prob_slip = round(prob_slip) + if (prob_slip < 5) //next to something, but they might slip off if (prob(prob_slip) ) M << "\blue You slipped!" @@ -942,4 +954,4 @@ turf/simulated/floor/proc/update_icon() A.y = 3 spawn (0) if ((A && A.loc)) - A.loc.Entered(A) \ No newline at end of file + A.loc.Entered(A) diff --git a/code/setup.dm b/code/setup.dm index 5ac2142c4eb..ab4049058e2 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -100,6 +100,8 @@ #define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head #define HEADCOVERSMOUTH 2048 +#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc + #define OPENCONTAINER 4096 // is an open container for chemistry purposes #define ONESIZEFITSALL 8192 // can be worn by fatties (or children? ugh) diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 3bf7f36e63a..252bef0624e 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 9f97576f485..8f05a55b4bd 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/maps/trunkmap.dmm b/maps/trunkmap.dmm index d993fa7b19a..332f051047d 100644 --- a/maps/trunkmap.dmm +++ b/maps/trunkmap.dmm @@ -512,7 +512,7 @@ "ajR" = (/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor/plating,/area/maintenance/starboard) "ajS" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plating,/area/maintenance/starboard) "ajT" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboard) -"ajU" = (/obj/item/weapon/screwdriver,/turf/simulated/floor/plating,/area/storage/tech) +"ajU" = (/obj/item/weapon/screwdriver,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/storage/tech) "ajV" = (/turf/simulated/floor/plating,/area/storage/tech) "ajW" = (/obj/item/clothing/glasses/meson,/obj/machinery/power/apc{dir = 4; name = "Tech. Storage APC"; pixel_x = 24; pixel_y = 0},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/storage/tech) "ajX" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/grid,/area/turret_protected/ai) @@ -603,7 +603,7 @@ "alE" = (/obj/rack{dir = 4},/obj/item/weapon/tank/jetpack,/turf/simulated/floor,/area/ai_monitored/storage/eva) "alF" = (/obj/rack{dir = 8},/obj/item/clothing/suit/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/mask/medical,/turf/simulated/floor,/area/ai_monitored/storage/eva) "alG" = (/obj/rack{dir = 4},/obj/item/clothing/suit/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/mask/medical,/turf/simulated/floor,/area/ai_monitored/storage/eva) -"alH" = (/obj/rack{dir = 8},/turf/simulated/floor,/area/ai_monitored/storage/eva) +"alH" = (/obj/rack{dir = 8},/obj/item/clothing/shoes/magboots,/turf/simulated/floor,/area/ai_monitored/storage/eva) "alI" = (/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva) "alJ" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact-f"; initialize_directions = 5; layer = 3},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) "alK" = (/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact-f"; initialize_directions = 10; layer = 3},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) @@ -670,7 +670,7 @@ "amT" = (/obj/closet/wardrobe/red,/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/security/main) "amU" = (/obj/grille,/obj/window/reinforced/west,/obj/window/reinforced/east,/obj/window/reinforced/south,/turf/simulated/floor/plating,/area/security/main) "amV" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1; initialize_directions = 0; level = 1},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"amW" = (/obj/rack{dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva) +"amW" = (/obj/rack{dir = 4},/obj/item/clothing/shoes/magboots,/turf/simulated/floor,/area/ai_monitored/storage/eva) "amX" = (/obj/rack{dir = 8},/obj/item/weapon/tank/jetpack,/turf/simulated/floor,/area/ai_monitored/storage/eva) "amY" = (/obj/machinery/alarm{pixel_y = 22},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/crowbar,/turf/simulated/floor,/area/ai_monitored/storage/eva) "amZ" = (/obj/table{icon_state = "tabledir"; dir = 9},/obj/item/weapon/sheet/metal{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva) @@ -1775,7 +1775,7 @@ "aIg" = (/obj/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/secondary/exit) "aIh" = (/turf/simulated/floor,/area/hallway/secondary/exit) "aIi" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor,/area/hallway/secondary/exit) -"aIj" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/secondary/exit) +"aIj" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor,/area/hallway/secondary/exit) "aIk" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/hallway/secondary/exit) "aIl" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor,/area/hallway/secondary/exit) "aIm" = (/obj/machinery/camera{c_tag = "Escape Shuttle Hallway Central"},/obj/machinery/power/apc{dir = 1; name = "Escape Hall APC"; pixel_y = 24},/obj/cable{icon_state = "0-2"; d2 = 2},/obj/cable,/turf/simulated/floor,/area/hallway/secondary/exit)