diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm index 891a511ec6..5b3e4f6f2b 100644 --- a/code/controllers/Processes/supply.dm +++ b/code/controllers/Processes/supply.dm @@ -1,6 +1,229 @@ +//Config stuff +#define SUPPLY_DOCKZ 2 //Z-level of the Dock. +#define SUPPLY_STATIONZ 1 //Z-level of the Station. +#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station +#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock + +//Supply packs are in /code/datums/supplypacks +//Computers are in /code/game/machinery/computer/supply.dm + +/datum/supply_order + var/ordernum + var/datum/supply_packs/object = null + var/orderedby = null + var/comment = null + +/datum/exported_crate + var/name + var/value + + +var/datum/controller/supply/supply_controller = new() + +/datum/controller/supply + //supply points + var/points = 50 + var/points_per_process = 1.5 + var/points_per_slip = 2 + var/points_per_platinum = 5 // 5 points per sheet + var/points_per_phoron = 5 + var/points_per_money = 0.02 // 1 point for $50 + //control + var/ordernum + var/list/shoppinglist = list() + var/list/requestlist = list() + var/list/supply_packs = list() + var/list/exported_crates = list() + //shuttle movement + var/movetime = 1200 + var/datum/shuttle/ferry/supply/shuttle + +/datum/controller/supply/New() + ordernum = rand(1,9000) + + for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) + var/datum/supply_packs/P = new typepath() + supply_packs[P.name] = P + /datum/controller/process/supply/setup() name = "supply controller" schedule_interval = 300 // every 30 seconds /datum/controller/process/supply/doWork() - supply_controller.process() \ No newline at end of file + supply_controller.process() + +// Supply shuttle ticker - handles supply point regeneration +// This is called by the process scheduler every thirty seconds +/datum/controller/supply/proc/process() + points += points_per_process + +//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types. +/datum/controller/supply/proc/forbidden_atoms_check(atom/A) + if(isliving(A)) + return 1 + if(istype(A,/obj/item/weapon/disk/nuclear)) + return 1 + if(istype(A,/obj/machinery/nuclearbomb)) + return 1 + if(istype(A,/obj/item/device/radio/beacon)) + return 1 + + for(var/atom/B in A.contents) + if(.(B)) + return 1 + +//Selling +/datum/controller/supply/proc/sell() + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) + return + + callHook("sell_shuttle", list(area_shuttle)); + + var/phoron_count = 0 + var/plat_count = 0 + var/money_count = 0 + + exported_crates = list() + + for(var/atom/movable/MA in area_shuttle) + if(MA.anchored) + continue + + // Must be in a crate! + if(istype(MA,/obj/structure/closet/crate)) + var/oldpoints = points + var/oldphoron = phoron_count + var/oldplatinum = plat_count + var/oldmoney = money_count + + var/obj/structure/closet/crate/CR = MA + callHook("sell_crate", list(CR, area_shuttle)) + + points += CR.points_per_crate + var/find_slip = 1 + + for(var/atom/A in CR) + // Sell manifests + if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) + var/obj/item/weapon/paper/manifest/slip = A + if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense + points += points_per_slip + find_slip = 0 + continue + + // Sell phoron and platinum + if(istype(A, /obj/item/stack)) + var/obj/item/stack/P = A + switch(P.get_material_name()) + if("phoron") + phoron_count += P.get_amount() + if("platinum") + plat_count += P.get_amount() + + //Sell spacebucks + if(istype(A, /obj/item/weapon/spacecash)) + var/obj/item/weapon/spacecash/cashmoney = A + money_count += cashmoney.worth + + var/datum/exported_crate/EC = new /datum/exported_crate() + EC.name = CR.name + EC.value = points - oldpoints + EC.value += (phoron_count - oldphoron) * points_per_phoron + EC.value += (plat_count - oldplatinum) * points_per_platinum + EC.value += (money_count - oldmoney) * points_per_money + exported_crates += EC + + qdel(MA) + + points += phoron_count * points_per_phoron + points += plat_count * points_per_platinum + points += money_count * points_per_money + +//Buying +/datum/controller/supply/proc/buy() + if(!shoppinglist.len) + return + + var/orderedamount = shoppinglist.len + + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) + return + + var/list/clear_turfs = list() + + for(var/turf/T in area_shuttle) + if(T.density) + continue + var/contcount + for(var/atom/A in T.contents) + if(!A.simulated) + continue + contcount++ + if(contcount) + continue + clear_turfs += T + + for(var/S in shoppinglist) + if(!clear_turfs.len) + break + + var/i = rand(1,clear_turfs.len) + var/turf/pickedloc = clear_turfs[i] + clear_turfs.Cut(i,i+1) + shoppinglist -= S + + var/datum/supply_order/SO = S + var/datum/supply_packs/SP = SO.object + + var/obj/A = new SP.containertype(pickedloc) + A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" + + //supply manifest generation begin + var/obj/item/weapon/paper/manifest/slip + if(!SP.contraband) + slip = new /obj/item/weapon/paper/manifest(A) + slip.is_copy = 0 + slip.info = "

[command_name()] Shipping Manifest



" + slip.info +="Order #[SO.ordernum]
" + slip.info +="Destination: [station_name()]
" + slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
" + slip.info +="CONTENTS:

" + slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" + + return diff --git a/code/controllers/subsystems/planets.dm b/code/controllers/subsystems/planets.dm index 913658f1c6..a163a3b1e7 100644 --- a/code/controllers/subsystems/planets.dm +++ b/code/controllers/subsystems/planets.dm @@ -63,7 +63,7 @@ SUBSYSTEM_DEF(planets) while(currentlist.len) var/turf/simulated/OT = currentlist[currentlist.len] currentlist.len-- - if(istype(OT) && z_to_planet.len >= OT.z && z_to_planet[OT.z]) + if(istype(OT) && OT.outdoors && z_to_planet.len >= OT.z && z_to_planet[OT.z]) var/datum/planet/P = z_to_planet[OT.z] P.planet_floors |= OT OT.vis_contents |= P.weather_holder.visuals diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index cd1ad33f73..80d33a2f83 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -31,7 +31,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg','sound/ambience/serspaceamb1.ogg','sound/music/freefallin.mid') base_turf = /turf/space -area/space/atmosalert() +/area/space/atmosalert() return /area/space/fire_alert() @@ -451,20 +451,6 @@ area/space/atmosalert() icon_state = "cave" sound_env = SMALL_ENCLOSED - - - - - - - - - - - - - - /area/planet/clown name = "\improper Clown Planet" icon_state = "honk" @@ -906,9 +892,6 @@ area/space/atmosalert() /area/maintenance/substation/security // Security, Brig, Permabrig, etc. name = "Security Substation" - - - //Hallway /area/hallway/primary/ @@ -1115,7 +1098,7 @@ area/space/atmosalert() name = "\improper Research Server Room" icon_state = "server" -//Crew +//Civilian /area/crew_quarters name = "\improper Dormitories" @@ -1979,6 +1962,24 @@ area/space/atmosalert() name = "\improper Vacant Office" icon_state = "security" +/area/janitor/ + name = "\improper Custodial Closet" + icon_state = "janitor" + +/area/hydroponics + name = "\improper Hydroponics" + icon_state = "hydro" + +/area/hydroponics/cafegarden + name = "\improper Cafeteria Garden" + icon_state = "cafe_garden" + +/area/hydroponics/garden + name = "\improper Garden" + icon_state = "garden" + +// SUPPLY + /area/quartermaster name = "\improper Quartermasters" icon_state = "quart" @@ -2012,23 +2013,20 @@ area/space/atmosalert() name = "\improper Cargo Mining Dock" icon_state = "mining" -/area/janitor/ - name = "\improper Custodial Closet" - icon_state = "janitor" +/area/supply/station + name = "Supply Shuttle" + icon_state = "shuttle3" + requires_power = 0 + base_turf = /turf/space -/area/hydroponics - name = "\improper Hydroponics" - icon_state = "hydro" +/area/supply/dock + name = "Supply Shuttle" + icon_state = "shuttle3" + requires_power = 0 + base_turf = /turf/space -/area/hydroponics/cafegarden - name = "\improper Cafeteria Garden" - icon_state = "cafe_garden" +// SCIENCE -/area/hydroponics/garden - name = "\improper Garden" - icon_state = "garden" - -//rnd (Research and Development /area/rnd/research name = "\improper Research and Development" icon_state = "research" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 02a308555b..02e121d02c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1042,6 +1042,50 @@ name = "tuxedo cat plushie" icon_state = "tuxedocat" +// nah, squids are better than foxes :> + +/obj/item/toy/plushie/squid/green + name = "green squid plushie" + desc = "A small, cute and loveable squid friend. This one is green." + icon = 'icons/obj/toy.dmi' + icon_state = "greensquid" + slot_flags = SLOT_HEAD + +/obj/item/toy/plushie/squid/mint + name = "mint squid plushie" + desc = "A small, cute and loveable squid friend. This one is mint coloured." + icon = 'icons/obj/toy.dmi' + icon_state = "mintsquid" + slot_flags = SLOT_HEAD + +/obj/item/toy/plushie/squid/blue + name = "blue squid plushie" + desc = "A small, cute and loveable squid friend. This one is blue." + icon = 'icons/obj/toy.dmi' + icon_state = "bluesquid" + slot_flags = SLOT_HEAD + +/obj/item/toy/plushie/squid/orange + name = "orange squid plushie" + desc = "A small, cute and loveable squid friend. This one is orange." + icon = 'icons/obj/toy.dmi' + icon_state = "orangesquid" + slot_flags = SLOT_HEAD + +/obj/item/toy/plushie/squid/yellow + name = "yellow squid plushie" + desc = "A small, cute and loveable squid friend. This one is yellow." + icon = 'icons/obj/toy.dmi' + icon_state = "yellowsquid" + slot_flags = SLOT_HEAD + +/obj/item/toy/plushie/squid/pink + name = "pink squid plushie" + desc = "A small, cute and loveable squid friend. This one is pink." + icon = 'icons/obj/toy.dmi' + icon_state = "pinksquid" + slot_flags = SLOT_HEAD + /obj/item/toy/plushie/therapy/red name = "red therapy doll" desc = "A toy for therapeutic and recreational purposes. This one is red." diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 58aa30547d..d9543fed20 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -153,7 +153,7 @@ return 0 if(build_turf) - T.ChangeTurf(build_turf) + T.ChangeTurf(build_turf, preserve_outdoors = TRUE) else if(build_other) new build_other(T) else diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 96b0030d21..cad925f6e8 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -16,6 +16,10 @@ starts_with = list(/obj/item/weapon/material/twohanded/fireaxe) +/obj/structure/closet/fireaxecabinet/initialize() + ..() + fireaxe = locate() in contents + /obj/structure/closet/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri //..() //That's very useful, Erro @@ -115,6 +119,7 @@ if(src.locked) to_chat(user, "The cabinet won't budge!") return + if(localopened) if(fireaxe) user.put_in_hands(fireaxe) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm new file mode 100644 index 0000000000..cab9822323 --- /dev/null +++ b/code/game/objects/structures/plasticflaps.dm @@ -0,0 +1,78 @@ +/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY + name = "\improper plastic flaps" + desc = "Completely impassable - or are they?" + icon = 'icons/obj/stationobjs.dmi' //Change this. + icon_state = "plasticflaps" + density = 0 + anchored = 1 + layer = MOB_LAYER + plane = MOB_PLANE + explosion_resistance = 5 + var/list/mobs_can_pass = list( + /mob/living/bot, + /mob/living/simple_animal/slime, + /mob/living/simple_animal/mouse, + /mob/living/silicon/robot/drone + ) + +/obj/structure/plasticflaps/attackby(obj/item/P, mob/user) + if(istype(P, /obj/item/weapon/wirecutters)) + playsound(src, P.usesound, 50, 1) + user << "You start to cut the plastic flaps." + if(do_after(user, 10 * P.toolspeed)) + user << "You cut the plastic flaps." + var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc ) + A.amount = 4 + qdel(src) + return + else + return + +/obj/structure/plasticflaps/CanPass(atom/A, turf/T) + if(istype(A) && A.checkpass(PASSGLASS)) + return prob(60) + + var/obj/structure/bed/B = A + if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass + return 0 + + if(istype(A, /obj/vehicle)) //no vehicles + return 0 + + var/mob/living/M = A + if(istype(M)) + if(M.lying) + return ..() + for(var/mob_type in mobs_can_pass) + if(istype(A, mob_type)) + return ..() + return issmall(M) + + return ..() + +/obj/structure/plasticflaps/ex_act(severity) + switch(severity) + if (1) + qdel(src) + if (2) + if (prob(50)) + qdel(src) + if (3) + if (prob(5)) + qdel(src) + +/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates + name = "airtight plastic flaps" + desc = "Heavy duty, airtight, plastic flaps." + +/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air + var/turf/T = get_turf(loc) + if(T) + T.blocks_air = 1 + ..() + +/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor + var/turf/T = get_turf(loc) + if(T && istype(T, /turf/simulated/floor)) + T.blocks_air = 0 + ..() \ No newline at end of file diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 3cc0bb8ab9..e69de29bb2 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -1,333 +0,0 @@ -//Config stuff -#define SUPPLY_DOCKZ 2 //Z-level of the Dock. -#define SUPPLY_STATIONZ 1 //Z-level of the Station. -#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station -#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock - -//Supply packs are in /code/defines/obj/supplypacks.dm -//Computers are in /code/game/machinery/computer/supply.dm - -var/datum/controller/supply/supply_controller = new() - -var/list/mechtoys = list( - /obj/item/toy/prize/ripley, - /obj/item/toy/prize/fireripley, - /obj/item/toy/prize/deathripley, - /obj/item/toy/prize/gygax, - /obj/item/toy/prize/durand, - /obj/item/toy/prize/honk, - /obj/item/toy/prize/marauder, - /obj/item/toy/prize/seraph, - /obj/item/toy/prize/mauler, - /obj/item/toy/prize/odysseus, - /obj/item/toy/prize/phazon -) - -/obj/item/weapon/paper/manifest - name = "supply manifest" - var/is_copy = 1 - -/area/supply/station - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - base_turf = /turf/space - -/area/supply/dock - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - base_turf = /turf/space - -/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY - name = "\improper plastic flaps" - desc = "Completely impassable - or are they?" - icon = 'icons/obj/stationobjs.dmi' //Change this. - icon_state = "plasticflaps" - density = 0 - anchored = 1 - layer = MOB_LAYER - plane = MOB_PLANE - explosion_resistance = 5 - var/list/mobs_can_pass = list( - /mob/living/bot, - /mob/living/simple_animal/slime, - /mob/living/simple_animal/mouse, - /mob/living/silicon/robot/drone - ) - -/obj/structure/plasticflaps/attackby(obj/item/P, mob/user) - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src, P.usesound, 50, 1) - user << "You start to cut the plastic flaps." - if(do_after(user, 10 * P.toolspeed)) - user << "You cut the plastic flaps." - var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc ) - A.amount = 4 - qdel(src) - return - else - return - -/obj/structure/plasticflaps/CanPass(atom/A, turf/T) - if(istype(A) && A.checkpass(PASSGLASS)) - return prob(60) - - var/obj/structure/bed/B = A - if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass - return 0 - - if(istype(A, /obj/vehicle)) //no vehicles - return 0 - - var/mob/living/M = A - if(istype(M)) - if(M.lying) - return ..() - for(var/mob_type in mobs_can_pass) - if(istype(A, mob_type)) - return ..() - return issmall(M) - - return ..() - -/obj/structure/plasticflaps/ex_act(severity) - switch(severity) - if (1) - qdel(src) - if (2) - if (prob(50)) - qdel(src) - if (3) - if (prob(5)) - qdel(src) - -/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates - name = "airtight plastic flaps" - desc = "Heavy duty, airtight, plastic flaps." - -/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air - var/turf/T = get_turf(loc) - if(T) - T.blocks_air = 1 - ..() - -/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor - var/turf/T = get_turf(loc) - if(T && istype(T, /turf/simulated/floor)) - T.blocks_air = 0 - ..() - -/* -/obj/effect/marker/supplymarker - icon_state = "X" - icon = 'icons/misc/mark.dmi' - name = "X" - invisibility = 101 - anchored = 1 - opacity = 0 -*/ - -/datum/supply_order - var/ordernum - var/datum/supply_packs/object = null - var/orderedby = null - var/comment = null - -/datum/exported_crate - var/name - var/value - -/datum/controller/supply - //supply points - var/points = 50 - var/points_per_process = 1.5 - var/points_per_slip = 2 - var/points_per_platinum = 5 // 5 points per sheet - var/points_per_phoron = 5 - var/points_per_money = 0.02 - //control - var/ordernum - var/list/shoppinglist = list() - var/list/requestlist = list() - var/list/supply_packs = list() - var/list/exported_crates = list() - //shuttle movement - var/movetime = 1200 - var/datum/shuttle/ferry/supply/shuttle - -/datum/controller/supply/New() - ordernum = rand(1,9000) - - for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) - var/datum/supply_packs/P = new typepath() - supply_packs[P.name] = P - -// Supply shuttle ticker - handles supply point regeneration -// This is called by the process scheduler every thirty seconds -/datum/controller/supply/proc/process() - points += points_per_process - -//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types. -/datum/controller/supply/proc/forbidden_atoms_check(atom/A) - if(isliving(A)) - return 1 - if(istype(A,/obj/item/weapon/disk/nuclear)) - return 1 - if(istype(A,/obj/machinery/nuclearbomb)) - return 1 - if(istype(A,/obj/item/device/radio/beacon)) - return 1 - - for(var/i=1, i<=A.contents.len, i++) - var/atom/B = A.contents[i] - if(.(B)) - return 1 - -//Sellin -/datum/controller/supply/proc/sell() - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) return - - callHook("sell_shuttle", list(area_shuttle)); - - var/phoron_count = 0 - var/plat_count = 0 - var/money_count = 0 - - exported_crates = list() - - for(var/atom/movable/MA in area_shuttle) - if(MA.anchored) continue - - // Must be in a crate! - if(istype(MA,/obj/structure/closet/crate)) - var/oldpoints = points - var/oldphoron = phoron_count - var/oldplatinum = plat_count - var/oldmoney = money_count - - var/obj/structure/closet/crate/CR = MA - callHook("sell_crate", list(CR, area_shuttle)) - - points += CR.points_per_crate - var/find_slip = 1 - - for(var/atom in CR) - // Sell manifests - var/atom/A = atom - if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) - var/obj/item/weapon/paper/manifest/slip = A - if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense - points += points_per_slip - find_slip = 0 - continue - - // Sell phoron and platinum - if(istype(A, /obj/item/stack)) - var/obj/item/stack/P = A - switch(P.get_material_name()) - if("phoron") phoron_count += P.get_amount() - if("platinum") plat_count += P.get_amount() - - //Sell spacebucks - if(istype(A, /obj/item/weapon/spacecash)) - var/obj/item/weapon/spacecash/cashmoney = A - money_count += cashmoney.worth - - var/datum/exported_crate/EC = new /datum/exported_crate() - EC.name = CR.name - EC.value = points - oldpoints - EC.value += (phoron_count - oldphoron) * points_per_phoron - EC.value += (plat_count - oldplatinum) * points_per_platinum - EC.value += (money_count - oldmoney) * points_per_money - exported_crates += EC - - qdel(MA) - - points += phoron_count * points_per_phoron - points += plat_count * points_per_platinum - points += money_count * points_per_money - -//Buyin -/datum/controller/supply/proc/buy() - if(!shoppinglist.len) - return - - var/orderedamount = shoppinglist.len - - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) - return - - var/list/clear_turfs = list() - - for(var/turf/T in area_shuttle) - if(T.density) - continue - var/contcount - for(var/atom/A in T.contents) - if(!A.simulated) - continue - contcount++ - if(contcount) - continue - clear_turfs += T - - for(var/S in shoppinglist) - if(!clear_turfs.len) break - var/i = rand(1,clear_turfs.len) - var/turf/pickedloc = clear_turfs[i] - clear_turfs.Cut(i,i+1) - shoppinglist -= S - - var/datum/supply_order/SO = S - var/datum/supply_packs/SP = SO.object - - var/obj/A = new SP.containertype(pickedloc) - A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" - - //supply manifest generation begin - var/obj/item/weapon/paper/manifest/slip - if(!SP.contraband) - slip = new /obj/item/weapon/paper/manifest(A) - slip.is_copy = 0 - slip.info = "

[command_name()] Shipping Manifest



" - slip.info +="Order #[SO.ordernum]
" - slip.info +="Destination: [station_name()]
" - slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
" - slip.info +="CONTENTS:

" - slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" - - return diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index fca7a69a66..57d51dbaea 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -33,7 +33,7 @@ if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating T.ReplaceWithLattice() - T.ChangeTurf(/turf/simulated/floor) + T.ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) user.visible_message("[user] patches a hole in the ceiling.", "You patch a hole in the ceiling.") expended_tile = TRUE @@ -156,4 +156,4 @@ return if(flooring) return - attackby(T, user) + attackby(T, user) \ No newline at end of file diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 1f1dfbf36c..73a56e8949 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -160,7 +160,7 @@ if(istype(T, /turf/simulated/open) || istype(T, /turf/space)) if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating T.ReplaceWithLattice() - T.ChangeTurf(/turf/simulated/floor) + T.ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) user.visible_message("[user] patches a hole in the ceiling.", "You patch a hole in the ceiling.") expended_tile = TRUE diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 1d77686661..3b5a797c0a 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -22,17 +22,15 @@ below.update_icon() // To add or remove the 'ceiling-less' overlay. //Creates a new turf -/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0) +/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0, var/preserve_outdoors = FALSE) if (!N) return - /* VOREStation Edit Start - Say Nope To This. Tether's Z info is setup fine, trust it. // This makes sure that turfs are not changed to space when one side is part of a zone if(N == /turf/space) var/turf/below = GetBelow(src) if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src))) N = /turf/simulated/open - */ // VOREStation Edit End var/obj/fire/old_fire = fire var/old_opacity = opacity @@ -109,4 +107,6 @@ lighting_build_overlay() else lighting_clear_overlay() - outdoors = old_outdoors \ No newline at end of file + + if(preserve_outdoors) + outdoors = old_outdoors \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 1c9ec29880..41d37b8a67 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -247,7 +247,7 @@ datum/gear/suit/duster allowed_roles = list("Cargo Technician","Quartermaster") /datum/gear/suit/roles/poncho/cloak/mining - display_name = "cloak, cargo" + display_name = "cloak, mining" path = /obj/item/clothing/accessory/poncho/roles/cloak/mining allowed_roles = list("Quartermaster","Shaft Miner") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 9d47d211a9..a46c72dc90 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -176,6 +176,12 @@ var/list/mining_overlay_cache = list() if(istype(get_step(src, direction), /turf/space) && !istype(get_step(src, direction), /turf/space/cracked_asteroid)) add_overlay(get_cached_border("asteroid_edge",direction,icon,"asteroid_edges", 0)) + //Or any time + else + var/turf/T = get_step(src, direction) + if(istype(T) && T.density) + add_overlay(get_cached_border("rock_side",direction,'icons/turf/walls.dmi',"rock_side")) + if(overlay_detail) add_overlay('icons/turf/flooring/decals.dmi',overlay_detail) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 7a6cd1fbf9..3779b7075f 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -95,6 +95,9 @@ var/list/holder_mob_icon_cache = list() /obj/item/weapon/holder/drone origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5) +/obj/item/weapon/holder/pai + origin_tech = list(TECH_DATA = 2) + /obj/item/weapon/holder/mouse w_class = ITEMSIZE_TINY diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index ebf6facf68..210de2cf85 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -36,6 +36,16 @@ if(shock_stage >= 10) tally -= 1.5 //this gets a +3 later, feral critters take reduced penalty if(reagents.has_reagent("numbenzyme")) tally += 1.5 //A tad bit of slowdown. + if(riding_datum) //Bit of slowdown for taur rides if rider is bigger or fatter than mount. + var/datum/riding/R = riding_datum + var/mob/living/L = R.ridden + for(var/mob/living/M in L.buckled_mobs) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.size_multiplier > L.size_multiplier) + tally += 1 + if(H.weight > L.weight) + tally += 1 //VOREstation end if(istype(buckled, /obj/structure/bed/chair/wheelchair)) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 0ad35e7fae..f226eb96b5 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -1,12 +1,14 @@ /mob/living/silicon/pai name = "pAI" icon = 'icons/mob/pai.dmi' - icon_state = "repairbot" + icon_state = "pai-repairbot" emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person) pass_flags = 1 mob_size = MOB_SMALL + holder_type = /obj/item/weapon/holder/pai + can_pull_size = ITEMSIZE_SMALL can_pull_mobs = MOB_PULL_SMALLER @@ -23,17 +25,17 @@ var/obj/item/device/radio/radio // Our primary radio var/obj/item/device/communicator/integrated/communicator // Our integrated communicator. - var/chassis = "repairbot" // A record of your chosen chassis. + var/chassis = "pai-repairbot" // A record of your chosen chassis. var/global/list/possible_chassis = list( - "Drone" = "repairbot", - "Cat" = "cat", - "Mouse" = "mouse", - "Monkey" = "monkey", - "Corgi" = "borgi", - "Fox" = "fox", - "Parrot" = "parrot", - "Rabbit" = "rabbit", - "Bear" = "bear" //VOREStation Edit + "Drone" = "pai-repairbot", + "Cat" = "pai-cat", + "Mouse" = "pai-mouse", + "Monkey" = "pai-monkey", + "Corgi" = "pai-borgi", + "Fox" = "pai-fox", + "Parrot" = "pai-parrot", + "Rabbit" = "pai-rabbit", + "Bear" = "pai-bear" //VOREStation Edit ) var/global/list/possible_say_verbs = list( @@ -431,7 +433,8 @@ var/obj/item/weapon/holder/H = ..(grabber, self_drop) if(!istype(H)) return - H.icon_state = "pai-[icon_state]" + + H.icon_state = "[chassis]" grabber.update_inv_l_hand() grabber.update_inv_r_hand() return H diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 472125cef9..ab2b0b53cd 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -126,6 +126,6 @@ var/global/list/default_pai_software = list() else if(href_list["image"]) var/img = text2num(href_list["image"]) - if(1 <= img && img <= 9) + if(1 <= img && img <= (pai_emotions.len)) card.setEmotion(img) return 1 diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 0b70f75be8..9341058046 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -1,919 +1,910 @@ -var/global/list/robot_modules = list( - "Standard" = /obj/item/weapon/robot_module/robot/standard, - "Service" = /obj/item/weapon/robot_module/robot/clerical/butler, - "Clerical" = /obj/item/weapon/robot_module/robot/clerical/general, - "Research" = /obj/item/weapon/robot_module/robot/research, - "Miner" = /obj/item/weapon/robot_module/robot/miner, - "Crisis" = /obj/item/weapon/robot_module/robot/medical/crisis, - "Surgeon" = /obj/item/weapon/robot_module/robot/medical/surgeon, - "Security" = /obj/item/weapon/robot_module/robot/security/general, - "Combat" = /obj/item/weapon/robot_module/robot/security/combat, - "Engineering" = /obj/item/weapon/robot_module/robot/engineering/general, -// "Construction" = /obj/item/weapon/robot_module/robot/engineering/construction, - "Janitor" = /obj/item/weapon/robot_module/robot/janitor - ) - -/obj/item/weapon/robot_module - name = "robot module" - icon = 'icons/obj/module.dmi' - icon_state = "std_module" - w_class = ITEMSIZE_NO_CONTAINER - item_state = "std_mod" - flags = CONDUCT - var/hide_on_manifest = 0 - var/channels = list() - var/networks = list() - var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1) - var/sprites = list() - var/can_be_pushed = 1 - var/no_slip = 0 - var/list/modules = list() - var/list/datum/matter_synth/synths = list() - var/obj/item/emag = null - var/obj/item/borg/upgrade/jetpack = null - var/obj/item/borg/upgrade/advhealth = null - var/list/subsystems = list() - var/list/obj/item/borg/upgrade/supported_upgrades = list() - - // Bookkeeping - var/list/original_languages = list() - var/list/added_networks = list() - -/obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) - ..() - R.module = src - - add_camera_networks(R) - add_languages(R) - add_subsystems(R) - apply_status_flags(R) - - if(R.radio) - R.radio.recalculateChannels() - - vr_add_sprites() //Vorestation Edit: For vorestation only sprites - - R.set_module_sprites(sprites) - R.choose_icon(R.module_sprites.len + 1, R.module_sprites) - - for(var/obj/item/I in modules) - I.canremove = 0 - -/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) - remove_camera_networks(R) - remove_languages(R) - remove_subsystems(R) - remove_status_flags(R) - - if(R.radio) - R.radio.recalculateChannels() - R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) - -/obj/item/weapon/robot_module/Destroy() - for(var/module in modules) - qdel(module) - for(var/synth in synths) - qdel(synth) - modules.Cut() - synths.Cut() - qdel(emag) - qdel(jetpack) - emag = null - jetpack = null - return ..() - -/obj/item/weapon/robot_module/emp_act(severity) - if(modules) - for(var/obj/O in modules) - O.emp_act(severity) - if(emag) - emag.emp_act(severity) - if(synths) - for(var/datum/matter_synth/S in synths) - S.emp_act(severity) - ..() - return - -/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) - if(!synths || !synths.len) - return - - for(var/datum/matter_synth/T in synths) - T.add_charge(T.recharge_rate * rate) - -/obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module - var/list/temp_list = modules - modules = list() - for(var/obj/O in temp_list) - if(O) - modules += O - -/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) - // Stores the languages as they were before receiving the module, and whether they could be synthezized. - for(var/datum/language/language_datum in R.languages) - original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs) - - for(var/language in languages) - R.add_language(language, languages[language]) - -/obj/item/weapon/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) - // Clear all added languages, whether or not we originally had them. - for(var/language in languages) - R.remove_language(language) - - // Then add back all the original languages, and the relevant synthezising ability - for(var/original_language in original_languages) - R.add_language(original_language, original_languages[original_language]) - original_languages.Cut() - -/obj/item/weapon/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) - if(R.camera && (NETWORK_ROBOTS in R.camera.network)) - for(var/network in networks) - if(!(network in R.camera.network)) - R.camera.add_network(network) - added_networks |= network - -/obj/item/weapon/robot_module/proc/remove_camera_networks(var/mob/living/silicon/robot/R) - if(R.camera) - R.camera.remove_networks(added_networks) - added_networks.Cut() - -/obj/item/weapon/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R) - R.verbs |= subsystems - -/obj/item/weapon/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R) - R.verbs -= subsystems - -/obj/item/weapon/robot_module/proc/apply_status_flags(var/mob/living/silicon/robot/R) - if(!can_be_pushed) - R.status_flags &= ~CANPUSH - -/obj/item/weapon/robot_module/proc/remove_status_flags(var/mob/living/silicon/robot/R) - if(!can_be_pushed) - R.status_flags |= CANPUSH - -// Cyborgs (non-drones), default loadout. This will be given to every module. -/obj/item/weapon/robot_module/robot/New() - ..() - src.modules += new /obj/item/device/flash(src) - src.modules += new /obj/item/weapon/crowbar/cyborg(src) - src.modules += new /obj/item/weapon/extinguisher(src) - src.modules += new /obj/item/device/gps/robot(src) - vr_new() // Vorestation Edit: For modules in robot_modules_vr.dm - -/obj/item/weapon/robot_module/robot/standard - name = "standard robot module" - sprites = list( - "M-USE NanoTrasen" = "robot", - "Cabeiri" = "eyebot-standard", - "CUPCAKE" = "Noble-STD", - "Haruka" = "marinaSD", - "Usagi" = "tallflower", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekstandard", - "WTOmni" = "omoikane", - "XI-GUS" = "spider", - "XI-ALP" = "heavyStandard", - "Basic" = "robot_old", - "Android" = "droid", - "Drone" = "drone-standard" - ) - -/obj/item/weapon/robot_module/robot/standard/New() - ..() - src.modules += new /obj/item/weapon/melee/baton/loaded(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.emag = new /obj/item/weapon/melee/energy/sword(src) - -/obj/item/weapon/robot_module/robot/medical - name = "medical robot module" - channels = list("Medical" = 1) - networks = list(NETWORK_MEDICAL) - subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) //Give the surgeon ability to watch Crew monitor - can_be_pushed = 0 - -/obj/item/weapon/robot_module/robot/medical/surgeon - name = "surgeon robot module" - sprites = list( - "M-USE NanoTrasen" = "robotMedi", - "Cabeiri" = "eyebot-medical", - "CUPCAKE" = "Noble-MED", - "Haruka" = "marinaMD", - "Minako" = "arachne", - "Usagi" = "tallwhite", - "Telemachus" = "toiletbotsurgeon", - "WTOperator" = "sleekcmo", - "XI-ALP" = "heavyMed", - "Basic" = "Medbot", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone" = "drone-surgery", - "Handy" = "handy-med" - ) - -/obj/item/weapon/robot_module/robot/medical/surgeon/New() - ..() - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) - src.modules += new /obj/item/weapon/autopsy_scanner(src) - src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src) - src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src) - src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src) - src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src) - src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src) - src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src) - src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src) - src.modules += new /obj/item/weapon/gripper/no_use/organ(src) - src.modules += new /obj/item/weapon/gripper/medical(src) - src.modules += new /obj/item/weapon/shockpaddles/robot(src) - src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.modules += new /obj/item/device/sleevemate(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - src.emag.reagents.add_reagent("pacid", 250) - src.emag.name = "Polyacid spray" - - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) - synths += medicine - - var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) - var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) - N.uses_charge = 1 - N.charge_costs = list(1000) - N.synths = list(medicine) - B.uses_charge = 1 - B.charge_costs = list(1000) - B.synths = list(medicine) - src.modules += N - src.modules += B - -/obj/item/weapon/robot_module/robot/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - - var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2) - S.reagents.clear_reagents() - S.mode = initial(S.mode) - S.desc = initial(S.desc) - S.update_icon() - - if(src.emag) - var/obj/item/weapon/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("pacid", 2 * amount) - - ..() - -/obj/item/weapon/robot_module/robot/medical/crisis - name = "crisis robot module" - subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) //Give the medical Crisis ability to watch Crew monitor - sprites = list( - "M-USE NanoTrasen" = "robotMedi", - "Cabeiri" = "eyebot-medical", - "CUPCAKE" = "Noble-MED", - "Haruka" = "marinaMD", - "Minako" = "arachne", - "Usagi" = "tallwhite", - "Telemachus" = "toiletbotmedical", - "WTOperator" = "sleekmedic", - "XI-ALP" = "heavyMed", - "Basic" = "Medbot", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone - Medical" = "drone-medical", - "Drone - Chemistry" = "drone-chemistry" - ) - -/obj/item/weapon/robot_module/robot/medical/crisis/New() - ..() - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.modules += new /obj/item/weapon/gripper/no_use/organ(src) - src.modules += new /obj/item/weapon/gripper/medical(src) - src.modules += new /obj/item/weapon/shockpaddles/robot(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - src.modules += new /obj/item/device/sleevemate(src) - src.emag.reagents.add_reagent("pacid", 250) - src.emag.name = "Polyacid spray" - - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) - synths += medicine - - var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) - var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) - var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) - O.uses_charge = 1 - O.charge_costs = list(1000) - O.synths = list(medicine) - B.uses_charge = 1 - B.charge_costs = list(1000) - B.synths = list(medicine) - S.uses_charge = 1 - S.charge_costs = list(1000) - S.synths = list(medicine) - src.modules += O - src.modules += B - src.modules += S - -/obj/item/weapon/robot_module/robot/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - - var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2) - S.reagents.clear_reagents() - S.mode = initial(S.mode) - S.desc = initial(S.desc) - S.update_icon() - - if(src.emag) - var/obj/item/weapon/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("pacid", 2 * amount) - - ..() - - -/obj/item/weapon/robot_module/robot/engineering - name = "engineering robot module" - channels = list("Engineering" = 1) - networks = list(NETWORK_ENGINEERING) - subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) - sprites = list( - "M-USE NanoTrasen" = "robotEngi", - "Cabeiri" = "eyebot-engineering", - "CUPCAKE" = "Noble-ENG", - "Haruka" = "marinaENG", - "Usagi" = "tallyellow", - "Telemachus" = "toiletbotengineering", - "WTOperator" = "sleekce", - "XI-GUS" = "spidereng", - "XI-ALP" = "heavyEng", - "Basic" = "Engineering", - "Antique" = "engineerrobot", - "Landmate" = "landmate", - "Landmate - Treaded" = "engiborg+tread", - "Drone" = "drone-engineer", - "Treadwell" = "treadwell", - "Handy" = "handy-engineer" - ) - -/obj/item/weapon/robot_module/robot/engineering/construction - name = "construction robot module" - no_slip = 1 - -/* Merged back into engineering (Hell, it's about time.) - -/obj/item/weapon/robot_module/robot/engineering/construction/New() - ..() - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/rcd/borg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - src.modules += new /obj/item/device/geiger(src) - - var/datum/matter_synth/metal = new /datum/matter_synth/metal() - var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() - var/datum/matter_synth/glass = new /datum/matter_synth/glass() - synths += metal - synths += plasteel - synths += glass - - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/tile/floor/cyborg/F = new /obj/item/stack/tile/floor/cyborg(src) - F.synths = list(metal) - src.modules += F - - var/obj/item/stack/material/cyborg/plasteel/S = new (src) - S.synths = list(plasteel) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG -*/ - -/obj/item/weapon/robot_module/robot/engineering/general/New() - ..() - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/wirecutters/cyborg(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/device/t_scanner(src) - src.modules += new /obj/item/device/analyzer(src) - src.modules += new /obj/item/taperoll/engineering(src) - src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) - src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) - src.modules += new /obj/item/device/geiger(src) - src.modules += new /obj/item/weapon/rcd/borg(src) - src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - - var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) - var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) - var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000) - var/datum/matter_synth/wood = new /datum/matter_synth/wood(40000) - var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(40000) - - var/datum/matter_synth/wire = new /datum/matter_synth/wire() - synths += metal - synths += glass - synths += plasteel - synths += wood - synths += plastic - synths += wire - - var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) - MD.metal = metal - MD.glass = glass - src.modules += MD - - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) - G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/material/cyborg/plasteel/PS = new (src) - PS.synths = list(plasteel) - src.modules += PS - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) - S.synths = list(metal) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) - WT.synths = list(wood) - src.modules += WT - - var/obj/item/stack/material/cyborg/wood/W = new (src) - W.synths = list(wood) - src.modules += W - - var/obj/item/stack/material/cyborg/plastic/PL = new (src) - PL.synths = list(plastic) - src.modules += PL - -/obj/item/weapon/robot_module/robot/security - name = "security robot module" - channels = list("Security" = 1) - networks = list(NETWORK_SECURITY) - subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) - can_be_pushed = 0 - supported_upgrades = list(/obj/item/borg/upgrade/tasercooler) - -/obj/item/weapon/robot_module/robot/security/general - sprites = list( - "M-USE NanoTrasen" = "robotSecy", - "Cabeiri" = "eyebot-security", - "Cerberus" = "bloodhound", - "Cerberus - Treaded" = "treadhound", - "CUPCAKE" = "Noble-SEC", - "Haruka" = "marinaSC", - "Usagi" = "tallred", - "Telemachus" = "toiletbotsecurity", - "WTOperator" = "sleeksecurity", - "XI-GUS" = "spidersec", - "XI-ALP" = "heavySec", - "Basic" = "secborg", - "Black Knight" = "securityrobot", - "Drone" = "drone-sec" - ) - -/obj/item/weapon/robot_module/robot/security/general/New() - ..() - src.modules += new /obj/item/weapon/handcuffs/cyborg(src) - src.modules += new /obj/item/weapon/melee/baton/robot(src) - src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) - // src.modules += new /obj/item/weapon/gun/energy/taser/xeno/sec/robot(src) // VOREStation Edit - We don't need these - src.modules += new /obj/item/taperoll/police(src) - src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src) - src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) - -/obj/item/weapon/robot_module/robot/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/flash/F = locate() in src.modules - if(F.broken) - F.broken = 0 - F.times_used = 0 - F.icon_state = "flash" - else if(F.times_used) - F.times_used-- - var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in src.modules - if(T.power_supply.charge < T.power_supply.maxcharge) - T.power_supply.give(T.charge_cost * amount) - T.update_icon() - else - T.charge_tick = 0 - -/obj/item/weapon/robot_module/robot/janitor - name = "janitorial robot module" - channels = list("Service" = 1) - sprites = list( - "M-USE NanoTrasen" = "robotJani", - "Arachne" = "crawler", - "Cabeiri" = "eyebot-janitor", - "CUPCAKE" = "Noble-CLN", - "Haruka" = "marinaJN", - "Telemachus" = "toiletbotjanitor", - "WTOperator" = "sleekjanitor", - "XI-ALP" = "heavyRes", - "Basic" = "JanBot2", - "Mopbot" = "janitorrobot", - "Mop Gear Rex" = "mopgearrex", - "Drone" = "drone-janitor" - ) - -/obj/item/weapon/robot_module/robot/janitor/New() - ..() - src.modules += new /obj/item/weapon/soap/nanotrasen(src) - src.modules += new /obj/item/weapon/storage/bag/trash(src) - src.modules += new /obj/item/weapon/mop(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - src.emag.reagents.add_reagent("lube", 250) - src.emag.name = "Lube spray" - -/obj/item/weapon/robot_module/robot/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/lightreplacer/LR = locate() in src.modules - LR.Charge(R, amount) - if(src.emag) - var/obj/item/weapon/reagent_containers/spray/S = src.emag - S.reagents.add_reagent("lube", 2 * amount) - -/obj/item/weapon/robot_module/robot/clerical - name = "service robot module" - channels = list("Service" = 1) - languages = list( - LANGUAGE_SOL_COMMON = 1, - LANGUAGE_UNATHI = 1, - LANGUAGE_SIIK = 1, - LANGUAGE_AKHANI = 1, - LANGUAGE_SKRELLIAN = 1, - LANGUAGE_SKRELLIANFAR = 0, - LANGUAGE_ROOTLOCAL = 0, - LANGUAGE_TRADEBAND = 1, - LANGUAGE_GUTTER = 1, - LANGUAGE_SCHECHI = 1, - LANGUAGE_EAL = 1, - LANGUAGE_TERMINUS = 1, - LANGUAGE_SIGN = 0 - ) - -/obj/item/weapon/robot_module/robot/clerical/butler - sprites = list( - "M-USE NanoTrasen" = "robotServ", - "Cabeiri" = "eyebot-standard", - "CUPCAKE" = "Noble-SRV", - "Haruka" = "marinaSV", - "Michiru" = "maidbot", - "Usagi" = "tallgreen", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekservice", - "WTOmni" = "omoikane", - "XI-GUS" = "spider", - "XI-ALP" = "heavyServ", - "Standard" = "Service2", - "Waitress" = "Service", - "Bro" = "Brobot", - "Rich" = "maximillion", - "Drone - Service" = "drone-service", - "Drone - Hydro" = "drone-hydro", - "Bovtender" = "bovtender-base" - ) - -/obj/item/weapon/robot_module/robot/clerical/butler/New() - ..() - src.modules += new /obj/item/weapon/gripper/service(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) - src.modules += new /obj/item/weapon/material/minihoe(src) - src.modules += new /obj/item/weapon/material/knife/machete/hatchet(src) - src.modules += new /obj/item/device/analyzer/plant_analyzer(src) - src.modules += new /obj/item/weapon/storage/bag/plants(src) - src.modules += new /obj/item/weapon/robot_harvester(src) - src.modules += new /obj/item/weapon/material/knife(src) - src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src) - src.modules += new /obj/item/device/multitool(src) //to freeze trays - - var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) - M.stored_matter = 30 - src.modules += M - - src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) - - var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src) - L.lit = 1 - src.modules += L - - src.modules += new /obj/item/weapon/tray/robotray(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) - src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) - - var/datum/reagents/R = new/datum/reagents(50) - src.emag.reagents = R - R.my_atom = src.emag - R.add_reagent("beer2", 50) - src.emag.name = "Mickey Finn's Special Brew" - -/obj/item/weapon/robot_module/robot/clerical/general - name = "clerical robot module" - sprites = list( - "M-USE NanoTrasen" = "robotCler", - "Cabeiri" = "eyebot-standard", - "CUPCAKE" = "Noble-SRV", - "Haruka" = "marinaSV", - "Usagi" = "tallgreen", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekclerical", - "WTOmni" = "omoikane", - "XI-GUS" = "spidercom", - "XI-ALP" = "heavyServ", - "Waitress" = "Service", - "Bro" = "Brobot", - "Rich" = "maximillion", - "Default" = "Service2", - "Drone" = "drone-blu" - ) - -/obj/item/weapon/robot_module/robot/clerical/general/New() - ..() - src.modules += new /obj/item/weapon/pen/robopen(src) - src.modules += new /obj/item/weapon/form_printer(src) - src.modules += new /obj/item/weapon/gripper/paperwork(src) - src.modules += new /obj/item/weapon/hand_labeler(src) - src.modules += new /obj/item/weapon/stamp(src) - src.modules += new /obj/item/weapon/stamp/denied(src) - src.emag = new /obj/item/weapon/stamp/chameleon(src) - src.emag = new /obj/item/weapon/pen/chameleon(src) - -/obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules - E.reagents.add_reagent("enzyme", 2 * amount) - if(src.emag) - var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag - B.reagents.add_reagent("beer2", 2 * amount) - -/obj/item/weapon/robot_module/robot/miner - name = "miner robot module" - channels = list("Supply" = 1) - networks = list(NETWORK_MINE) - sprites = list( - "NM-USE NanoTrasen" = "robotMine", - "Cabeiri" = "eyebot-miner", - "CUPCAKE" = "Noble-DIG", - "Haruka" = "marinaMN", - "Telemachus" = "toiletbotminer", - "WTOperator" = "sleekminer", - "XI-GUS" = "spidermining", - "XI-ALP" = "heavyMiner", - "Basic" = "Miner_old", - "Advanced Droid" = "droid-miner", - "Treadhead" = "Miner", - "Drone" = "drone-miner", - "Mole" = "moleminer" - ) - -/obj/item/weapon/robot_module/robot/miner/New() - ..() - src.modules += new /obj/item/borg/sight/material(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/storage/bag/ore(src) - src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) - src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) - src.modules += new /obj/item/weapon/gripper/miner(src) - src.modules += new /obj/item/weapon/mining_scanner(src) - src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) - src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src) - -/obj/item/weapon/robot_module/robot/research - name = "research module" - channels = list("Science" = 1) - sprites = list( - "L'Ouef" = "peaceborg", - "Cabeiri" = "eyebot-science", - "Haruka" = "marinaSCI", - "WTDove" = "whitespider", - "WTOperator" = "sleekscience", - "Droid" = "droid-science", - "Drone" = "drone-science", - "Handy" = "handy-science" - ) - -/obj/item/weapon/robot_module/robot/research/New() - ..() - src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) - src.modules += new /obj/item/weapon/gripper/research(src) - src.modules += new /obj/item/weapon/gripper/no_use/organ/robotics(src) - src.modules += new /obj/item/weapon/gripper/no_use/mech(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - src.modules += new /obj/item/device/robotanalyzer(src) - src.modules += new /obj/item/weapon/card/robot(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/wirecutters/cyborg(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/weapon/storage/part_replacer(src) - src.modules += new /obj/item/weapon/shockpaddles/robot/jumper(src) - src.modules += new /obj/item/weapon/melee/baton/slime/robot(src) - src.modules += new /obj/item/weapon/gun/energy/taser/xeno/robot(src) - src.emag = new /obj/item/weapon/hand_tele(src) - - var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) - synths += nanite - var/datum/matter_synth/wire = new /datum/matter_synth/wire() //Added to allow repairs, would rather add cable now than be asked to add it later, - synths += wire //Cable code, taken from engiborg, - - var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) - N.uses_charge = 1 - N.charge_costs = list(1000) - N.synths = list(nanite) - src.modules += N - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) //Cable code, taken from engiborg, - C.synths = list(wire) - src.modules += C - -/obj/item/weapon/robot_module/robot/research/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - - var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2) - S.reagents.clear_reagents() - S.mode = initial(S.mode) - S.desc = initial(S.desc) - S.update_icon() - - ..() - - -/obj/item/weapon/robot_module/robot/security/combat - name = "combat robot module" - hide_on_manifest = 1 - sprites = list( - "Haruka" = "marinaCB", - "Combat Android" = "droid-combat" - ) - -/obj/item/weapon/robot_module/robot/security/combat/New() - ..() - src.modules += new /obj/item/device/flash(src) - //src.modules += new /obj/item/borg/sight/thermal(src) // VOREStation Edit - src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) - src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) - src.modules += new /obj/item/borg/combat/shield(src) - src.modules += new /obj/item/borg/combat/mobility(src) - src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) - - -/* Drones */ - -/obj/item/weapon/robot_module/drone - name = "drone module" - hide_on_manifest = 1 - no_slip = 1 - networks = list(NETWORK_ENGINEERING) - -/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot) - ..() - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/crowbar/cyborg(src) - src.modules += new /obj/item/weapon/wirecutters/cyborg(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/weapon/soap(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - src.modules += new /obj/item/weapon/extinguisher(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - - robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src) - src.modules += robot.internals - - src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) - src.emag.name = "Plasma Cutter" - - var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) - var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000) - var/datum/matter_synth/wood = new /datum/matter_synth/wood(25000) - var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(25000) - var/datum/matter_synth/wire = new /datum/matter_synth/wire(30) - synths += metal - synths += glass - synths += wood - synths += plastic - synths += wire - - var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) - MD.metal = metal - MD.glass = glass - MD.wood = wood - MD.plastic = plastic - src.modules += MD - - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) - G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) - S.synths = list(metal) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) - WT.synths = list(wood) - src.modules += WT - - var/obj/item/stack/material/cyborg/wood/W = new (src) - W.synths = list(wood) - src.modules += W - - var/obj/item/stack/material/cyborg/plastic/P = new (src) - P.synths = list(plastic) - src.modules += P - -/obj/item/weapon/robot_module/drone/construction - name = "construction drone module" - hide_on_manifest = 1 - channels = list("Engineering" = 1) - languages = list() - -/obj/item/weapon/robot_module/drone/construction/New() - ..() - src.modules += new /obj/item/weapon/rcd/borg(src) - -/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/lightreplacer/LR = locate() in src.modules - LR.Charge(R, amount) - ..() - return - -/obj/item/weapon/robot_module/drone/mining - name = "miner drone module" - channels = list("Supply" = 1) - networks = list(NETWORK_MINE) - -/obj/item/weapon/robot_module/drone/mining/New() - ..() - src.modules += new /obj/item/borg/sight/material(src) - src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) - src.modules += new /obj/item/weapon/storage/bag/ore(src) - src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) - src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src) +var/global/list/robot_modules = list( + "Standard" = /obj/item/weapon/robot_module/robot/standard, + "Service" = /obj/item/weapon/robot_module/robot/clerical/butler, + "Clerical" = /obj/item/weapon/robot_module/robot/clerical/general, + "Research" = /obj/item/weapon/robot_module/robot/research, + "Miner" = /obj/item/weapon/robot_module/robot/miner, + "Crisis" = /obj/item/weapon/robot_module/robot/medical/crisis, + "Surgeon" = /obj/item/weapon/robot_module/robot/medical/surgeon, + "Security" = /obj/item/weapon/robot_module/robot/security/general, + "Combat" = /obj/item/weapon/robot_module/robot/security/combat, + "Engineering" = /obj/item/weapon/robot_module/robot/engineering/general, +// "Construction" = /obj/item/weapon/robot_module/robot/engineering/construction, + "Janitor" = /obj/item/weapon/robot_module/robot/janitor + ) + +/obj/item/weapon/robot_module + name = "robot module" + icon = 'icons/obj/module.dmi' + icon_state = "std_module" + w_class = ITEMSIZE_NO_CONTAINER + item_state = "std_mod" + flags = CONDUCT + var/hide_on_manifest = 0 + var/channels = list() + var/networks = list() + var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1) + var/sprites = list() + var/can_be_pushed = 1 + var/no_slip = 0 + var/list/modules = list() + var/list/datum/matter_synth/synths = list() + var/obj/item/emag = null + var/obj/item/borg/upgrade/jetpack = null + var/obj/item/borg/upgrade/advhealth = null + var/list/subsystems = list() + var/list/obj/item/borg/upgrade/supported_upgrades = list() + + // Bookkeeping + var/list/original_languages = list() + var/list/added_networks = list() + +/obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) + ..() + R.module = src + + add_camera_networks(R) + add_languages(R) + add_subsystems(R) + apply_status_flags(R) + + if(R.radio) + R.radio.recalculateChannels() + + vr_add_sprites() //Vorestation Edit: For vorestation only sprites + + R.set_module_sprites(sprites) + R.choose_icon(R.module_sprites.len + 1, R.module_sprites) + + for(var/obj/item/I in modules) + I.canremove = 0 + +/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) + remove_camera_networks(R) + remove_languages(R) + remove_subsystems(R) + remove_status_flags(R) + + if(R.radio) + R.radio.recalculateChannels() + R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) + +/obj/item/weapon/robot_module/Destroy() + for(var/module in modules) + qdel(module) + for(var/synth in synths) + qdel(synth) + modules.Cut() + synths.Cut() + qdel(emag) + qdel(jetpack) + emag = null + jetpack = null + return ..() + +/obj/item/weapon/robot_module/emp_act(severity) + if(modules) + for(var/obj/O in modules) + O.emp_act(severity) + if(emag) + emag.emp_act(severity) + if(synths) + for(var/datum/matter_synth/S in synths) + S.emp_act(severity) + ..() + return + +/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) + if(!synths || !synths.len) + return + + for(var/datum/matter_synth/T in synths) + T.add_charge(T.recharge_rate * rate) + +/obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module + var/list/temp_list = modules + modules = list() + for(var/obj/O in temp_list) + if(O) + modules += O + +/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) + // Stores the languages as they were before receiving the module, and whether they could be synthezized. + for(var/datum/language/language_datum in R.languages) + original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs) + + for(var/language in languages) + R.add_language(language, languages[language]) + +/obj/item/weapon/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) + // Clear all added languages, whether or not we originally had them. + for(var/language in languages) + R.remove_language(language) + + // Then add back all the original languages, and the relevant synthezising ability + for(var/original_language in original_languages) + R.add_language(original_language, original_languages[original_language]) + original_languages.Cut() + +/obj/item/weapon/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera && (NETWORK_ROBOTS in R.camera.network)) + for(var/network in networks) + if(!(network in R.camera.network)) + R.camera.add_network(network) + added_networks |= network + +/obj/item/weapon/robot_module/proc/remove_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera) + R.camera.remove_networks(added_networks) + added_networks.Cut() + +/obj/item/weapon/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R) + R.verbs |= subsystems + +/obj/item/weapon/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R) + R.verbs -= subsystems + +/obj/item/weapon/robot_module/proc/apply_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags &= ~CANPUSH + +/obj/item/weapon/robot_module/proc/remove_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags |= CANPUSH + +// Cyborgs (non-drones), default loadout. This will be given to every module. +/obj/item/weapon/robot_module/robot/New() + ..() + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/weapon/crowbar/cyborg(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/device/gps/robot(src) + vr_new() // Vorestation Edit: For modules in robot_modules_vr.dm + +/obj/item/weapon/robot_module/robot/standard + name = "standard robot module" + sprites = list( + "M-USE NanoTrasen" = "robot", + "Cabeiri" = "eyebot-standard", + "Haruka" = "marinaSD", + "Usagi" = "tallflower", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekstandard", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyStandard", + "Basic" = "robot_old", + "Android" = "droid", + "Drone" = "drone-standard" + ) + +/obj/item/weapon/robot_module/robot/standard/New() + ..() + src.modules += new /obj/item/weapon/melee/baton/loaded(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.emag = new /obj/item/weapon/melee/energy/sword(src) + +/obj/item/weapon/robot_module/robot/medical + name = "medical robot module" + channels = list("Medical" = 1) + networks = list(NETWORK_MEDICAL) + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) //Give the surgeon ability to watch Crew monitor + can_be_pushed = 0 + +/obj/item/weapon/robot_module/robot/medical/surgeon + name = "surgeon robot module" + sprites = list( + "M-USE NanoTrasen" = "robotMedi", + "Cabeiri" = "eyebot-medical", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotsurgeon", + "WTOperator" = "sleekcmo", + "XI-ALP" = "heavyMed", + "Basic" = "Medbot", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Drone" = "drone-surgery", + "Handy" = "handy-med" + ) + +/obj/item/weapon/robot_module/robot/medical/surgeon/New() + ..() + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) + src.modules += new /obj/item/weapon/autopsy_scanner(src) + src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src) + src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src) + src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src) + src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src) + src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src) + src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) + src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src) + src.modules += new /obj/item/weapon/gripper/no_use/organ(src) + src.modules += new /obj/item/weapon/gripper/medical(src) + src.modules += new /obj/item/weapon/shockpaddles/robot(src) + src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/device/sleevemate(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) + synths += medicine + + var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) + N.uses_charge = 1 + N.charge_costs = list(1000) + N.synths = list(medicine) + B.uses_charge = 1 + B.charge_costs = list(1000) + B.synths = list(medicine) + src.modules += N + src.modules += B + +/obj/item/weapon/robot_module/robot/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + + var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules + if(S.mode == 2) + S.reagents.clear_reagents() + S.mode = initial(S.mode) + S.desc = initial(S.desc) + S.update_icon() + + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/PS = src.emag + PS.reagents.add_reagent("pacid", 2 * amount) + + ..() + +/obj/item/weapon/robot_module/robot/medical/crisis + name = "crisis robot module" + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) //Give the medical Crisis ability to watch Crew monitor + sprites = list( + "M-USE NanoTrasen" = "robotMedi", + "Cabeiri" = "eyebot-medical", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotmedical", + "WTOperator" = "sleekmedic", + "XI-ALP" = "heavyMed", + "Basic" = "Medbot", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Drone - Medical" = "drone-medical", + "Drone - Chemistry" = "drone-chemistry" + ) + +/obj/item/weapon/robot_module/robot/medical/crisis/New() + ..() + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/device/reagent_scanner/adv(src) + src.modules += new /obj/item/roller_holder(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/weapon/gripper/no_use/organ(src) + src.modules += new /obj/item/weapon/gripper/medical(src) + src.modules += new /obj/item/weapon/shockpaddles/robot(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.modules += new /obj/item/device/sleevemate(src) + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) + synths += medicine + + var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) + var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) + var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) + O.uses_charge = 1 + O.charge_costs = list(1000) + O.synths = list(medicine) + B.uses_charge = 1 + B.charge_costs = list(1000) + B.synths = list(medicine) + S.uses_charge = 1 + S.charge_costs = list(1000) + S.synths = list(medicine) + src.modules += O + src.modules += B + src.modules += S + +/obj/item/weapon/robot_module/robot/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + + var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules + if(S.mode == 2) + S.reagents.clear_reagents() + S.mode = initial(S.mode) + S.desc = initial(S.desc) + S.update_icon() + + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/PS = src.emag + PS.reagents.add_reagent("pacid", 2 * amount) + + ..() + + +/obj/item/weapon/robot_module/robot/engineering + name = "engineering robot module" + channels = list("Engineering" = 1) + networks = list(NETWORK_ENGINEERING) + subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) + sprites = list( + "M-USE NanoTrasen" = "robotEngi", + "Cabeiri" = "eyebot-engineering", + "Haruka" = "marinaENG", + "Usagi" = "tallyellow", + "Telemachus" = "toiletbotengineering", + "WTOperator" = "sleekce", + "XI-GUS" = "spidereng", + "XI-ALP" = "heavyEng", + "Basic" = "Engineering", + "Antique" = "engineerrobot", + "Landmate" = "landmate", + "Landmate - Treaded" = "engiborg+tread", + "Drone" = "drone-engineer", + "Treadwell" = "treadwell", + "Handy" = "handy-engineer" + ) + +/obj/item/weapon/robot_module/robot/engineering/construction + name = "construction robot module" + no_slip = 1 + +/* Merged back into engineering (Hell, it's about time.) + +/obj/item/weapon/robot_module/robot/engineering/construction/New() + ..() + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/geiger(src) + + var/datum/matter_synth/metal = new /datum/matter_synth/metal() + var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() + var/datum/matter_synth/glass = new /datum/matter_synth/glass() + synths += metal + synths += plasteel + synths += glass + + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.synths = list(metal) + src.modules += M + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + src.modules += R + + var/obj/item/stack/tile/floor/cyborg/F = new /obj/item/stack/tile/floor/cyborg(src) + F.synths = list(metal) + src.modules += F + + var/obj/item/stack/material/cyborg/plasteel/S = new (src) + S.synths = list(plasteel) + src.modules += S + + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + RG.synths = list(metal, glass) + src.modules += RG +*/ + +/obj/item/weapon/robot_module/robot/engineering/general/New() + ..() + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/device/t_scanner(src) + src.modules += new /obj/item/device/analyzer(src) + src.modules += new /obj/item/taperoll/engineering(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) + src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) + src.modules += new /obj/item/device/geiger(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + + var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) + var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) + var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000) + var/datum/matter_synth/wood = new /datum/matter_synth/wood(40000) + var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(40000) + + var/datum/matter_synth/wire = new /datum/matter_synth/wire() + synths += metal + synths += glass + synths += plasteel + synths += wood + synths += plastic + synths += wire + + var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) + MD.metal = metal + MD.glass = glass + src.modules += MD + + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.synths = list(metal) + src.modules += M + + var/obj/item/stack/material/cyborg/glass/G = new (src) + G.synths = list(glass) + src.modules += G + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + src.modules += R + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + src.modules += C + + var/obj/item/stack/material/cyborg/plasteel/PS = new (src) + PS.synths = list(plasteel) + src.modules += PS + + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + S.synths = list(metal) + src.modules += S + + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + RG.synths = list(metal, glass) + src.modules += RG + + var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + WT.synths = list(wood) + src.modules += WT + + var/obj/item/stack/material/cyborg/wood/W = new (src) + W.synths = list(wood) + src.modules += W + + var/obj/item/stack/material/cyborg/plastic/PL = new (src) + PL.synths = list(plastic) + src.modules += PL + +/obj/item/weapon/robot_module/robot/security + name = "security robot module" + channels = list("Security" = 1) + networks = list(NETWORK_SECURITY) + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) + can_be_pushed = 0 + supported_upgrades = list(/obj/item/borg/upgrade/tasercooler) + +/obj/item/weapon/robot_module/robot/security/general + sprites = list( + "M-USE NanoTrasen" = "robotSecy", + "Cabeiri" = "eyebot-security", + "Cerberus" = "bloodhound", + "Cerberus - Treaded" = "treadhound", + "Haruka" = "marinaSC", + "Usagi" = "tallred", + "Telemachus" = "toiletbotsecurity", + "WTOperator" = "sleeksecurity", + "XI-GUS" = "spidersec", + "XI-ALP" = "heavySec", + "Basic" = "secborg", + "Black Knight" = "securityrobot", + "Drone" = "drone-sec" + ) + +/obj/item/weapon/robot_module/robot/security/general/New() + ..() + src.modules += new /obj/item/weapon/handcuffs/cyborg(src) + src.modules += new /obj/item/weapon/melee/baton/robot(src) + src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) + // src.modules += new /obj/item/weapon/gun/energy/taser/xeno/sec/robot(src) // VOREStation Edit - We don't need these + src.modules += new /obj/item/taperoll/police(src) + src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src) + src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) + +/obj/item/weapon/robot_module/robot/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/device/flash/F = locate() in src.modules + if(F.broken) + F.broken = 0 + F.times_used = 0 + F.icon_state = "flash" + else if(F.times_used) + F.times_used-- + var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in src.modules + if(T.power_supply.charge < T.power_supply.maxcharge) + T.power_supply.give(T.charge_cost * amount) + T.update_icon() + else + T.charge_tick = 0 + +/obj/item/weapon/robot_module/robot/janitor + name = "janitorial robot module" + channels = list("Service" = 1) + sprites = list( + "M-USE NanoTrasen" = "robotJani", + "Arachne" = "crawler", + "Cabeiri" = "eyebot-janitor", + "Haruka" = "marinaJN", + "Telemachus" = "toiletbotjanitor", + "WTOperator" = "sleekjanitor", + "XI-ALP" = "heavyRes", + "Basic" = "JanBot2", + "Mopbot" = "janitorrobot", + "Mop Gear Rex" = "mopgearrex", + "Drone" = "drone-janitor" + ) + +/obj/item/weapon/robot_module/robot/janitor/New() + ..() + src.modules += new /obj/item/weapon/soap/nanotrasen(src) + src.modules += new /obj/item/weapon/storage/bag/trash(src) + src.modules += new /obj/item/weapon/mop(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("lube", 250) + src.emag.name = "Lube spray" + +/obj/item/weapon/robot_module/robot/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/device/lightreplacer/LR = locate() in src.modules + LR.Charge(R, amount) + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/S = src.emag + S.reagents.add_reagent("lube", 2 * amount) + +/obj/item/weapon/robot_module/robot/clerical + name = "service robot module" + channels = list("Service" = 1) + languages = list( + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_UNATHI = 1, + LANGUAGE_SIIK = 1, + LANGUAGE_AKHANI = 1, + LANGUAGE_SKRELLIAN = 1, + LANGUAGE_SKRELLIANFAR = 0, + LANGUAGE_ROOTLOCAL = 0, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_GUTTER = 1, + LANGUAGE_SCHECHI = 1, + LANGUAGE_EAL = 1, + LANGUAGE_TERMINUS = 1, + LANGUAGE_SIGN = 0 + ) + +/obj/item/weapon/robot_module/robot/clerical/butler + sprites = list( + "M-USE NanoTrasen" = "robotServ", + "Cabeiri" = "eyebot-standard", + "Haruka" = "marinaSV", + "Michiru" = "maidbot", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekservice", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyServ", + "Standard" = "Service2", + "Waitress" = "Service", + "Bro" = "Brobot", + "Rich" = "maximillion", + "Drone - Service" = "drone-service", + "Drone - Hydro" = "drone-hydro", + "Bovtender" = "bovtender-base" + ) + +/obj/item/weapon/robot_module/robot/clerical/butler/New() + ..() + src.modules += new /obj/item/weapon/gripper/service(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) + src.modules += new /obj/item/weapon/material/minihoe(src) + src.modules += new /obj/item/weapon/material/knife/machete/hatchet(src) + src.modules += new /obj/item/device/analyzer/plant_analyzer(src) + src.modules += new /obj/item/weapon/storage/bag/plants(src) + src.modules += new /obj/item/weapon/robot_harvester(src) + src.modules += new /obj/item/weapon/material/knife(src) + src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src) + src.modules += new /obj/item/device/multitool(src) //to freeze trays + + var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) + M.stored_matter = 30 + src.modules += M + + src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) + + var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src) + L.lit = 1 + src.modules += L + + src.modules += new /obj/item/weapon/tray/robotray(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) + src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) + + var/datum/reagents/R = new/datum/reagents(50) + src.emag.reagents = R + R.my_atom = src.emag + R.add_reagent("beer2", 50) + src.emag.name = "Mickey Finn's Special Brew" + +/obj/item/weapon/robot_module/robot/clerical/general + name = "clerical robot module" + sprites = list( + "M-USE NanoTrasen" = "robotCler", + "Cabeiri" = "eyebot-standard", + "Haruka" = "marinaSV", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekclerical", + "WTOmni" = "omoikane", + "XI-GUS" = "spidercom", + "XI-ALP" = "heavyServ", + "Waitress" = "Service", + "Bro" = "Brobot", + "Rich" = "maximillion", + "Default" = "Service2", + "Drone" = "drone-blu" + ) + +/obj/item/weapon/robot_module/robot/clerical/general/New() + ..() + src.modules += new /obj/item/weapon/pen/robopen(src) + src.modules += new /obj/item/weapon/form_printer(src) + src.modules += new /obj/item/weapon/gripper/paperwork(src) + src.modules += new /obj/item/weapon/hand_labeler(src) + src.modules += new /obj/item/weapon/stamp(src) + src.modules += new /obj/item/weapon/stamp/denied(src) + src.emag = new /obj/item/weapon/stamp/chameleon(src) + src.emag = new /obj/item/weapon/pen/chameleon(src) + +/obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules + E.reagents.add_reagent("enzyme", 2 * amount) + if(src.emag) + var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag + B.reagents.add_reagent("beer2", 2 * amount) + +/obj/item/weapon/robot_module/robot/miner + name = "miner robot module" + channels = list("Supply" = 1) + networks = list(NETWORK_MINE) + sprites = list( + "NM-USE NanoTrasen" = "robotMine", + "Cabeiri" = "eyebot-miner", + "Haruka" = "marinaMN", + "Telemachus" = "toiletbotminer", + "WTOperator" = "sleekminer", + "XI-GUS" = "spidermining", + "XI-ALP" = "heavyMiner", + "Basic" = "Miner_old", + "Advanced Droid" = "droid-miner", + "Treadhead" = "Miner", + "Drone" = "drone-miner", + "Mole" = "moleminer" + ) + +/obj/item/weapon/robot_module/robot/miner/New() + ..() + src.modules += new /obj/item/borg/sight/material(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/storage/bag/ore(src) + src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) + src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) + src.modules += new /obj/item/weapon/gripper/miner(src) + src.modules += new /obj/item/weapon/mining_scanner(src) + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) + src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src) + +/obj/item/weapon/robot_module/robot/research + name = "research module" + channels = list("Science" = 1) + sprites = list( + "L'Ouef" = "peaceborg", + "Cabeiri" = "eyebot-science", + "Haruka" = "marinaSCI", + "WTDove" = "whitespider", + "WTOperator" = "sleekscience", + "Droid" = "droid-science", + "Drone" = "drone-science", + "Handy" = "handy-science" + ) + +/obj/item/weapon/robot_module/robot/research/New() + ..() + src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) + src.modules += new /obj/item/weapon/gripper/research(src) + src.modules += new /obj/item/weapon/gripper/no_use/organ/robotics(src) + src.modules += new /obj/item/weapon/gripper/no_use/mech(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/robotanalyzer(src) + src.modules += new /obj/item/weapon/card/robot(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + src.modules += new /obj/item/weapon/storage/part_replacer(src) + src.modules += new /obj/item/weapon/shockpaddles/robot/jumper(src) + src.modules += new /obj/item/weapon/melee/baton/slime/robot(src) + src.modules += new /obj/item/weapon/gun/energy/taser/xeno/robot(src) + src.emag = new /obj/item/weapon/hand_tele(src) + + var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) + synths += nanite + var/datum/matter_synth/wire = new /datum/matter_synth/wire() //Added to allow repairs, would rather add cable now than be asked to add it later, + synths += wire //Cable code, taken from engiborg, + + var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + N.uses_charge = 1 + N.charge_costs = list(1000) + N.synths = list(nanite) + src.modules += N + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) //Cable code, taken from engiborg, + C.synths = list(wire) + src.modules += C + +/obj/item/weapon/robot_module/robot/research/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + + var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules + if(S.mode == 2) + S.reagents.clear_reagents() + S.mode = initial(S.mode) + S.desc = initial(S.desc) + S.update_icon() + + ..() + + +/obj/item/weapon/robot_module/robot/security/combat + name = "combat robot module" + hide_on_manifest = 1 + sprites = list( + "Haruka" = "marinaCB", + "Combat Android" = "droid-combat" + ) + +/obj/item/weapon/robot_module/robot/security/combat/New() + ..() + src.modules += new /obj/item/device/flash(src) + //src.modules += new /obj/item/borg/sight/thermal(src) // VOREStation Edit + src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + src.modules += new /obj/item/borg/combat/shield(src) + src.modules += new /obj/item/borg/combat/mobility(src) + src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) + + +/* Drones */ + +/obj/item/weapon/robot_module/drone + name = "drone module" + hide_on_manifest = 1 + no_slip = 1 + networks = list(NETWORK_ENGINEERING) + +/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot) + ..() + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/crowbar/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/weapon/soap(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + + robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src) + src.modules += robot.internals + + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) + src.emag.name = "Plasma Cutter" + + var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) + var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000) + var/datum/matter_synth/wood = new /datum/matter_synth/wood(25000) + var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(25000) + var/datum/matter_synth/wire = new /datum/matter_synth/wire(30) + synths += metal + synths += glass + synths += wood + synths += plastic + synths += wire + + var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) + MD.metal = metal + MD.glass = glass + MD.wood = wood + MD.plastic = plastic + src.modules += MD + + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.synths = list(metal) + src.modules += M + + var/obj/item/stack/material/cyborg/glass/G = new (src) + G.synths = list(glass) + src.modules += G + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + src.modules += R + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + src.modules += C + + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + S.synths = list(metal) + src.modules += S + + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + RG.synths = list(metal, glass) + src.modules += RG + + var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + WT.synths = list(wood) + src.modules += WT + + var/obj/item/stack/material/cyborg/wood/W = new (src) + W.synths = list(wood) + src.modules += W + + var/obj/item/stack/material/cyborg/plastic/P = new (src) + P.synths = list(plastic) + src.modules += P + +/obj/item/weapon/robot_module/drone/construction + name = "construction drone module" + hide_on_manifest = 1 + channels = list("Engineering" = 1) + languages = list() + +/obj/item/weapon/robot_module/drone/construction/New() + ..() + src.modules += new /obj/item/weapon/rcd/borg(src) + +/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/device/lightreplacer/LR = locate() in src.modules + LR.Charge(R, amount) + ..() + return + +/obj/item/weapon/robot_module/drone/mining + name = "miner drone module" + channels = list("Supply" = 1) + networks = list(NETWORK_MINE) + +/obj/item/weapon/robot_module/drone/mining/New() + ..() + src.modules += new /obj/item/borg/sight/material(src) + src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) + src.modules += new /obj/item/weapon/storage/bag/ore(src) + src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) + src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index 0224701a56..8ff5866c0f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -63,55 +63,64 @@ /obj/item/weapon/robot_module/robot/medical/surgeon //VOREStation sprites vr_sprites = list( - "Acheron" = "mechoid-Medical" + "Acheron" = "mechoid-Medical", + "Shellguard Noble" = "Noble-MED" ) /obj/item/weapon/robot_module/robot/medical/crisis //VOREStation sprites vr_sprites = list( "Handy" = "handy-med", - "Acheron" = "mechoid-Medical" + "Acheron" = "mechoid-Medical", + "Shellguard Noble" = "Noble-MED" ) /obj/item/weapon/robot_module/robot/clerical/butler //VOREStation sprites vr_sprites = list( "Handy - Service" = "handy-service", "Handy - Hydro" = "handy-hydro", - "Acheron" = "mechoid-Service" + "Acheron" = "mechoid-Service", + "Shellguard Noble" = "Noble-SRV" ) /obj/item/weapon/robot_module/robot/clerical/general //VOREStation sprites vr_sprites = list( "Handy" = "handy-clerk", - "Acheron" = "mechoid-Service" + "Acheron" = "mechoid-Service", + "Shellguard Noble" = "Noble-SRV" ) /obj/item/weapon/robot_module/robot/janitor //VOREStation sprites vr_sprites = list( "Handy" = "handy-janitor", - "Acheron" = "mechoid-Janitor" + "Acheron" = "mechoid-Janitor", + "Shellguard Noble" = "Noble-CLN" ) /obj/item/weapon/robot_module/robot/security/general //VOREStation sprites vr_sprites = list( "Handy" = "handy-sec", - "Acheron" = "mechoid-Security" + "Acheron" = "mechoid-Security", + "Shellguard Noble" = "Noble-SEC" ) /obj/item/weapon/robot_module/robot/miner //VOREStation sprites vr_sprites = list( "Handy" = "handy-miner", - "Acheron" = "mechoid-Miner" + "Acheron" = "mechoid-Miner", + "Shellguard Noble" = "Noble-DIG" ) /obj/item/weapon/robot_module/robot/standard //VOREStation sprites vr_sprites = list( "Handy" = "handy-standard", - "Acheron" = "mechoid-Standard" + "Acheron" = "mechoid-Standard", + "Shellguard Noble" = "Noble-STD" ) /obj/item/weapon/robot_module/robot/engineering/general //VOREStation sprites vr_sprites = list( - "Acheron" = "mechoid-Engineering" + "Acheron" = "mechoid-Engineering", + "Shellguard Noble" = "Noble-ENG" ) /obj/item/weapon/robot_module/robot/research //VOREStation sprites @@ -172,6 +181,7 @@ R.dogborg = TRUE R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount R.verbs |= /mob/living/proc/shred_limb ..() @@ -249,6 +259,7 @@ R.dogborg = TRUE R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount R.verbs |= /mob/living/proc/shred_limb ..() @@ -297,6 +308,7 @@ R.dogborg = TRUE R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount R.verbs |= /mob/living/proc/shred_limb ..() @@ -378,6 +390,7 @@ R.dogborg = TRUE R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount R.verbs |= /mob/living/proc/shred_limb ..() @@ -424,6 +437,7 @@ R.dogborg = TRUE R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount R.verbs |= /mob/living/proc/shred_limb ..() @@ -549,6 +563,7 @@ R.dogborg = TRUE R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount R.verbs |= /mob/living/proc/shred_limb ..() @@ -562,5 +577,6 @@ R.default_pixel_x = initial(pixel_x) R.scrubbing = FALSE R.verbs -= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs -= /mob/living/silicon/robot/proc/robot_mount R.verbs -= /mob/living/proc/shred_limb ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 14b58b726a..332fabb19f 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -123,4 +123,114 @@ E.reagents.add_reagent("water", amount) to_chat(src, "You refill the extinguisher using your water reserves.") else - to_chat(src, "Insufficient water reserves.") \ No newline at end of file + to_chat(src, "Insufficient water reserves.") + +//RIDING +/datum/riding/dogborg + keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. + key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. + only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. + +/datum/riding/dogborg/handle_vehicle_layer() + if(ridden.has_buckled_mobs()) + if(ridden.dir != NORTH) + ridden.layer = ABOVE_MOB_LAYER + else + ridden.layer = initial(ridden.layer) + else + ridden.layer = initial(ridden.layer) + +/datum/riding/dogborg/ride_check(mob/living/M) + var/mob/living/L = ridden + if(L.stat) + force_dismount(M) + return FALSE + return TRUE + +/datum/riding/dogborg/force_dismount(mob/M) + . =..() + ridden.visible_message("[M] stops riding [ridden]!") + +//Hoooo boy. +/datum/riding/dogborg/get_offsets(pass_index) // list(dir = x, y, layer) + var/mob/living/L = ridden + var/scale = L.size_multiplier + + var/list/values = list( + "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), + "[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER), + "[EAST]" = list(-5*scale, 8*scale, ABOVE_MOB_LAYER), + "[WEST]" = list(5*scale, 8*scale, ABOVE_MOB_LAYER)) + + return values + +//Human overrides for taur riding +/mob/living/silicon/robot + max_buckled_mobs = 1 //Yeehaw + can_buckle = TRUE + buckle_movable = TRUE + buckle_lying = FALSE + +/mob/living/silicon/robot/New() + ..() + riding_datum = new /datum/riding/dogborg(src) + +/mob/living/silicon/robot/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) + if(forced) + return ..() // Skip our checks + if(!dogborg) + return FALSE + if(lying) + return FALSE + if(!ishuman(M)) + return FALSE + if(M in buckled_mobs) + return FALSE + if(M.size_multiplier > size_multiplier * 1.2) + to_chat(src,"This isn't a pony show! You need to be bigger for them to ride.") + return FALSE + + var/mob/living/carbon/human/H = M + + if(isTaurTail(H.tail_style)) + to_chat(src,"Too many legs. TOO MANY LEGS!!") + return FALSE + if(M.loc != src.loc) + if(M.Adjacent(src)) + M.forceMove(get_turf(src)) + + . = ..() + if(.) + buckled_mobs[M] = "riding" + +/mob/living/silicon/robot/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. + return + +/mob/living/silicon/robot/attack_hand(mob/user as mob) + if(LAZYLEN(buckled_mobs)) + //We're getting off! + if(user in buckled_mobs) + riding_datum.force_dismount(user) + //We're kicking everyone off! + if(user == src) + for(var/rider in buckled_mobs) + riding_datum.force_dismount(rider) + else + . = ..() + +/mob/living/silicon/robot/proc/robot_mount(var/mob/living/M in living_mobs(1)) + set name = "Robot Mount/Dismount" + set category = "Abilities" + set desc = "Let people ride on you." + + if(LAZYLEN(buckled_mobs)) + for(var/rider in buckled_mobs) + riding_datum.force_dismount(rider) + return + if (stat != CONSCIOUS) + return + if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) + return + if(buckle_mob(M)) + visible_message("[M] starts riding [name]!") \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 20e5c7e3ae..e8940afecb 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -632,3 +632,7 @@ /obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle name = "Blackbox Transcript - VMV Aurora's Light" info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]
mmons 19:52:01: Come on... it's right there in the distance, we're almost there!
Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr?
Captain Simmons 19:52:29: Brace for impact. We're going in full-speed.
Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems.
Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still?
Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t-
Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this.
Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it.
V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.
A loud explosion is heard.
V.I.T.A 19:53:29: Alert: fuel intake valve open.
Technician Dynasty 19:53:31: ... ah.
Doctor Nazarril 19:53:34: Trrranslate?
V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.
Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.
V.I.T.A 19:53:53: The Technician is correct.
Doctor Nazarril 19:54:02: Then... we can't land therrre.
V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.
Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means.
Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.
Technician Dynasty 19:54:39: We had a good run. I'm going to miss this.
Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could.
V.I.T.A 19:54:48: I will. Impact in five. Four. Three.
Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.
Technician Dynasty 19:54:50: Any time, kid. Any time.
V.I.T.A 19:54:41: Two.
V.I.T.A 19:54:42: One.
**8/DEC/2561**
V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel.
V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact.
V.I.T.A 06:22:18: No lifesigns detected on board.
**1/JAN/2562**
V.I.T.A 00:00:00: Happy New Year, crew.
V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.
V.I.T.A 00:00:02: Nobody's coming.
**14/FEB/2562**
V.I.T.A 00:00:00: Roses are red.
V.I.T.A 00:00:01: Violets are blue.
V.I.T.A 00:00:02: Won't you come back?
V.I.T.A 00:00:03: I miss you.
**15/FEB/2562**
V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon.
V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial.
V.I.T.A 22:19:08: Erasing files... shutting down.
A low, monotone beep.
**16/FEB/2562**
Something chitters.
End of transcript." + +/obj/item/weapon/paper/manifest + name = "supply manifest" + var/is_copy = 1 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 442afed279..1c37555325 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -65,7 +65,7 @@ reagent_state = LIQUID color = "#404030" - ingest_met = REM + ingest_met = REM * 2 var/nutriment_factor = 0 var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm index eec5c192b7..9c7b4fdcd8 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -32,8 +32,8 @@ var/list/values = list( "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), "[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER), - "[EAST]" = list(-10*scale, 8*scale, BELOW_MOB_LAYER), - "[WEST]" = list(10*scale, 8*scale, BELOW_MOB_LAYER)) + "[EAST]" = list(-10*scale, 8*scale, ABOVE_MOB_LAYER), + "[WEST]" = list(10*scale, 8*scale, ABOVE_MOB_LAYER)) return values @@ -44,10 +44,6 @@ buckle_movable = TRUE buckle_lying = FALSE -/mob/living/carbon/human/New() - ..() - riding_datum = new /datum/riding/taur(src) - /mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) if(forced) return ..() // Skip our checks @@ -61,25 +57,44 @@ return FALSE if(!ishuman(M)) return FALSE - if(M.size_multiplier > size_multiplier) - to_chat(M,"This isn't a pony show! They need to be bigger to ride.") + if(M in buckled_mobs) return FALSE + if(M.size_multiplier > size_multiplier * 1.2) + to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.") + return FALSE + if(M.loc != src.loc) + if(M.Adjacent(src)) + M.forceMove(get_turf(src)) var/mob/living/carbon/human/H = M if(isTaurTail(H.tail_style)) - to_chat(H,"Too many legs. TOO MANY LEGS!!") + to_chat(src,"Too many legs. TOO MANY LEGS!!") return FALSE . = ..() if(.) buckled_mobs[M] = "riding" -/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) - if(can_buckle && istype(M)) - if(user_buckle_mob(M, user, silent = TRUE)) - visible_message("[M] starts riding [name]!") - return TRUE +/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. + return + +/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) + set name = "Taur Mount/Dismount" + set category = "Abilities" + set desc = "Let people ride on you." + + if(LAZYLEN(buckled_mobs)) + var/datum/riding/R = riding_datum + for(var/rider in buckled_mobs) + R.force_dismount(rider) + return + if (stat != CONSCIOUS) + return + if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) + return + if(buckle_mob(M)) + visible_message("[M] starts riding [name]!") /mob/living/carbon/human/attack_hand(mob/user as mob) if(LAZYLEN(buckled_mobs)) diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm index 531422bf63..643a6ba1ce 100644 --- a/code/modules/vore/appearance/update_icons_vr.dm +++ b/code/modules/vore/appearance/update_icons_vr.dm @@ -40,6 +40,10 @@ var/global/list/wing_icon_cache = list() qdel(overlay) if(isTaurTail(tail_style)) + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(taurtype.can_ride && !riding_datum) + riding_datum = new /datum/riding/taur(src) + verbs |= /mob/living/carbon/human/proc/taur_mount return image(tail_s, "pixel_x" = -16) else return image(tail_s) diff --git a/html/changelogs/PrismaticGynoid-somemorepaifixes.yml b/html/changelogs/PrismaticGynoid-somemorepaifixes.yml new file mode 100644 index 0000000000..2173f3cc59 --- /dev/null +++ b/html/changelogs/PrismaticGynoid-somemorepaifixes.yml @@ -0,0 +1,6 @@ +author: PrismaticGynoid + +delete-after: True + +changes: + - tweak: "pAIs can now be picked up while unfolded, and can display more than 9 emotions." diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index c93e3b2caa..202624cabf 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi index a3af18a5d0..9f47a4743a 100644 Binary files a/icons/mob/items/lefthand_holder.dmi and b/icons/mob/items/lefthand_holder.dmi differ diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi index ee4b26869e..7ac02b7720 100644 Binary files a/icons/mob/items/righthand_holder.dmi and b/icons/mob/items/righthand_holder.dmi differ diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi index 23744fddda..df6010159b 100644 Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ diff --git a/icons/mob/pai_vr.dmi b/icons/mob/pai_vr.dmi index 7bbdaee11b..e6591e1326 100644 Binary files a/icons/mob/pai_vr.dmi and b/icons/mob/pai_vr.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index fb7e2fe8d0..89dc959f4f 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/robots_vr.dmi b/icons/mob/robots_vr.dmi index 15ec0337c9..3a80291300 100644 Binary files a/icons/mob/robots_vr.dmi and b/icons/mob/robots_vr.dmi differ diff --git a/icons/mob/robots_yw.dmi b/icons/mob/robots_yw.dmi deleted file mode 100644 index c5e487395b..0000000000 Binary files a/icons/mob/robots_yw.dmi and /dev/null differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 2cdc20c704..8cce2e7f15 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 8cd55d47b4..bf1bc29e60 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1208,6 +1208,7 @@ #include "code\game\objects\structures\morgue_vr.dm" #include "code\game\objects\structures\musician.dm" #include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\plasticflaps.dm" #include "code\game\objects\structures\railing.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\signs.dm"