Moving robot icons around, and merging.

Any robot icons in robots_vr.dmi should work automagically if I'm reading vore's robot icon code right. Let's try it.
This commit is contained in:
Hawk_v3
2018-09-12 23:34:20 +01:00
35 changed files with 1518 additions and 1334 deletions

View File

@@ -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()
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 = "<h3>[command_name()] Shipping Manifest</h3><hr><br>"
slip.info +="Order #[SO.ordernum]<br>"
slip.info +="Destination: [station_name()]<br>"
slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT<br>"
slip.info +="CONTENTS:<br><ul>"
//spawn the stuff, finish generating the manifest while you're at it
if(SP.access)
if(isnum(SP.access))
A.req_access = list(SP.access)
else if(islist(SP.access))
var/list/L = SP.access // access var is a plain var, we need a list
A.req_access = L.Copy()
else
log_debug("<span class='danger'>Supply pack with invalid access restriction [SP.access] encountered!</span>")
var/list/contains
if(istype(SP,/datum/supply_packs/randomised))
var/datum/supply_packs/randomised/SPR = SP
contains = list()
if(SPR.contains.len)
for(var/j=1,j<=SPR.num_contained,j++)
contains += pick(SPR.contains)
else
contains = SP.contains
for(var/typepath in contains)
if(!typepath)
continue
var/number_of_items = max(1, contains[typepath])
for(var/j = 1 to number_of_items)
var/atom/B2 = new typepath(A)
if(slip)
slip.info += "<li>[B2.name]</li>" //add the item to the manifest
//manifest finalisation
if(slip)
slip.info += "</ul><br>"
slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS<hr>"
return

View File

@@ -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

View File

@@ -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"

View File

@@ -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."

View File

@@ -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

View File

@@ -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, "<span class='warning'>The cabinet won't budge!</span>")
return
if(localopened)
if(fireaxe)
user.put_in_hands(fireaxe)

View File

@@ -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 << "<span class='notice'>You start to cut the plastic flaps.</span>"
if(do_after(user, 10 * P.toolspeed))
user << "<span class='notice'>You cut the plastic flaps.</span>"
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
..()

View File

@@ -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 << "<span class='notice'>You start to cut the plastic flaps.</span>"
if(do_after(user, 10 * P.toolspeed))
user << "<span class='notice'>You cut the plastic flaps.</span>"
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 = "<h3>[command_name()] Shipping Manifest</h3><hr><br>"
slip.info +="Order #[SO.ordernum]<br>"
slip.info +="Destination: [station_name()]<br>"
slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT<br>"
slip.info +="CONTENTS:<br><ul>"
//spawn the stuff, finish generating the manifest while you're at it
if(SP.access)
if(isnum(SP.access))
A.req_access = list(SP.access)
else if(islist(SP.access))
var/list/L = SP.access // access var is a plain var, we need a list
A.req_access = L.Copy()
else
log_debug("<span class='danger'>Supply pack with invalid access restriction [SP.access] encountered!</span>")
var/list/contains
if(istype(SP,/datum/supply_packs/randomised))
var/datum/supply_packs/randomised/SPR = SP
contains = list()
if(SPR.contains.len)
for(var/j=1,j<=SPR.num_contained,j++)
contains += pick(SPR.contains)
else
contains = SP.contains
for(var/typepath in contains)
if(!typepath) continue
var/number_of_items = max(1, contains[typepath])
for(var/j = 1 to number_of_items)
var/atom/B2 = new typepath(A)
if(slip) slip.info += "<li>[B2.name]</li>" //add the item to the manifest
//manifest finalisation
if(slip)
slip.info += "</ul><br>"
slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS<hr>"
return

View File

@@ -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("<span class='notice'>[user] patches a hole in the ceiling.</span>", "<span class='notice'>You patch a hole in the ceiling.</span>")
expended_tile = TRUE
@@ -156,4 +156,4 @@
return
if(flooring)
return
attackby(T, user)
attackby(T, user)

View File

@@ -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("<span class='notice'>[user] patches a hole in the ceiling.</span>", "<span class='notice'>You patch a hole in the ceiling.</span>")
expended_tile = TRUE

View File

@@ -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
if(preserve_outdoors)
outdoors = old_outdoors

View File

@@ -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")

View File

@@ -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)

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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
..()

View File

@@ -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.")
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("<span class='notice'>[M] stops riding [ridden]!</span>")
//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,"<span class='warning'>This isn't a pony show! You need to be bigger for them to ride.</span>")
return FALSE
var/mob/living/carbon/human/H = M
if(isTaurTail(H.tail_style))
to_chat(src,"<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
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("<span class='notice'>[M] starts riding [name]!</span>")

View File

@@ -632,3 +632,7 @@
/obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle
name = "Blackbox Transcript - VMV Aurora's Light"
info = "<I>\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]</I><BR> <B>mmons 19:52:01:</B> Come on... it's right there in the distance, we're almost there!<BR> <B>Doctor Nazarril 19:52:26:</B> Odysseus online. Orrderrs, sirr?<BR> <B>Captain Simmons 19:52:29:</B> Brace for impact. We're going in full-speed.<BR> <B>Technician Dynasty 19:52:44:</B> Chief, fire's spread to the secondary propulsion systems.<BR> <B>Captain Simmons 19:52:51:</B> Copy. Any word from TraCon? Transponder's down still?<BR> <B>Technician Dynasty 19:53:02:</B> Can't get in touch, sir. Emergency beacon's active, but we're not going t-<BR> <B>Doctor Nazarril 19:53:08:</B> Don't say it. As long as we believe, we'll get through this.<BR> <B>Captain Simmons 19:53:11:</B> Damn right. We're a few klicks out from the port. Rough landing, but we can do it.<BR> <B>V.I.T.A 19:53:26:</B> Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.<BR> <B>A loud explosion is heard.</B><BR> <B>V.I.T.A 19:53:29:</B> Alert: fuel intake valve open.<BR> <B>Technician Dynasty 19:53:31:</B> ... ah.<BR> <B>Doctor Nazarril 19:53:34:</B> Trrranslate?<BR> <B>V.I.T.A 19:53:37:</B> 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.<BR> <B>Technician Dynasty 19:53:48:</B> 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.<BR> <B>V.I.T.A 19:53:53:</B> The Technician is correct.<BR> <B>Doctor Nazarril 19:54:02:</B> Then... we can't land therrre.<BR> <B>V.I.T.A 19:54:11:</B> Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible. <BR> <B>Captain Simmons 19:54:27:</B> I- alright. I'm bringing us down. You all know what this means.<BR> <B>Doctor Nazarril 19:54:33:</B> Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.<BR> <B>Technician Dynasty 19:54:39:</B> We had a good run. I'm going to miss this.<BR> <B>Captain Simmons 19:54:47:</B> VITA. Tell them we died heroes. Tell them... we did all we could.<BR> <B>V.I.T.A 19:54:48:</B> I will. Impact in five. Four. Three.<BR> <B>Doctor Nazarril 19:54:49:</B> Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.<BR> <B>Technician Dynasty 19:54:50:</B> Any time, kid. Any time.<BR> <B>V.I.T.A 19:54:41:</B> Two.<BR><B>V.I.T.A 19:54:42:</B> One.<BR> **8/DEC/2561**<BR> <B>V.I.T.A 06:22:16:</B> Backup power restored. Attempting to establish connection with emergency rescue personnel.<BR> <B>V.I.T.A 06:22:17:</B> Unable to establish connection. Transponder destroyed on impact.<BR> <B>V.I.T.A 06:22:18:</B> No lifesigns detected on board.<BR> **1/JAN/2562**<BR> <B>V.I.T.A 00:00:00:</B> Happy New Year, crew.<BR> <B>V.I.T.A 00:00:01:</B> Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.<BR> <B>V.I.T.A 00:00:02:</B> Nobody's coming.<BR> **14/FEB/2562**<BR> <B>V.I.T.A 00:00:00:</B> Roses are red.<BR> <B>V.I.T.A 00:00:01:</B> Violets are blue.<BR> <B>V.I.T.A 00:00:02:</B> Won't you come back?<BR> <B>V.I.T.A 00:00:03:</B> I miss you.<BR> **15/FEB/2562**<BR><B>V.I.T.A 22:19:06:</B> Power reserves critical. Transferring remaining power to emergency broadcasting beacon.<BR> <B>V.I.T.A 22:19:07:</B> Should anyone find this, lay them to rest. They deserve a proper burial.<BR> <B>V.I.T.A 22:19:08:</B> Erasing files... shutting down.<BR> <B>A low, monotone beep.</B><BR> **16/FEB/2562**<BR> <B>Something chitters.</B><BR> <B>End of transcript.</B>"
/obj/item/weapon/paper/manifest
name = "supply manifest"
var/is_copy = 1

View File

@@ -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.

View File

@@ -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,"<span class='warning'>This isn't a pony show! They need to be bigger to ride.</span>")
if(M in buckled_mobs)
return FALSE
if(M.size_multiplier > size_multiplier * 1.2)
to_chat(M,"<span class='warning'>This isn't a pony show! You need to be bigger for them to ride.</span>")
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,"<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
to_chat(src,"<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
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("<span class='notice'>[M] starts riding [name]!</span>")
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("<span class='notice'>[M] starts riding [name]!</span>")
/mob/living/carbon/human/attack_hand(mob/user as mob)
if(LAZYLEN(buckled_mobs))

View File

@@ -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)

View File

@@ -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."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -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"