[MIRROR] Add big manipulator. (#29500)

* Add big manipulator. (#84888)

## About The Pull Request
Sprites Update by ArcaneMusic:
![Снимок экрана 2024-07-24
081415](https://github.com/user-attachments/assets/db557ba1-c87e-4751-9cbe-55f543f7bdd3)
Video:
https://youtu.be/JoFvwwFzVvA
Text:
Big manipulator is a new machine crafting from circuit board which can
be created on engi/rnd/cargo/service techfabs.
Big manipulator performs a simple function of take and drop item. You
can unsecre it with wrench left click and rotate manipulator hand with
rigth wrench click.
Big manipulator speed depends on the tier of servo part inside it:
2/1.4/0.8/0.2 Seconds from 1/2/3/4 servo tier.

## Why It's Good For The Game

Provides more logistics mechanics for conveyor belt designs and other
cargo transportation.

## Changelog

🆑 by Xackii, sprites by ArcaneMusic
add: Added big manipulators.
/🆑

---------

Co-authored-by: Time-Green <7501474+Time-Green@ users.noreply.github.com>

* Add big manipulator.

---------

Co-authored-by: Xackii <120736708+Xackii@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@ users.noreply.github.com>
This commit is contained in:
SkyratBot
2024-08-22 11:29:44 +07:00
committed by GitHub
co-authored by Time-Green Xackii
parent 6556361b50
commit 4bbefe0679
13 changed files with 372 additions and 0 deletions
@@ -2,3 +2,8 @@
name = "Transmutation Rune"
icon_file = 'icons/effects/96x96.dmi'
json_config = 'code/datums/greyscale/json_configs/heretic_rune.json'
/datum/greyscale_config/manipulator_hand
name = "Manipulator Hand"
icon_file = 'icons/obj/machines/big_manipulator_parts/big_manipulator_hand.dmi'
json_config = 'code/datums/greyscale/json_configs/manipulator_hand.json'
@@ -3,6 +3,11 @@
icon_file = 'icons/obj/doors/airlocks/material/material.dmi'
json_config = 'code/datums/greyscale/json_configs/material_airlock.json'
/datum/greyscale_config/big_manipulator
name = "Big Manipulator"
icon_file = 'icons/obj/machines/big_manipulator_parts/big_manipulator_core.dmi'
json_config = 'code/datums/greyscale/json_configs/big_manipulator.json'
//
// BENCHES
//
@@ -0,0 +1,15 @@
{
"core": [
{
"type": "icon_state",
"icon_state": "core",
"blend_mode": "overlay"
},
{
"type": "icon_state",
"icon_state": "core_colour",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -0,0 +1,15 @@
{
"hand": [
{
"type": "icon_state",
"icon_state": "hand",
"blend_mode": "overlay"
},
{
"type": "icon_state",
"icon_state": "hand_colour",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
+282
View File
@@ -0,0 +1,282 @@
/// Manipulator Core. Main part of the mechanism that carries out the entire process.
/obj/machinery/big_manipulator
name = "Big Manipulator"
desc = "Take and drop objects. Innovation..."
icon = 'icons/obj/machines/big_manipulator_parts/big_manipulator_core.dmi'
icon_state = "core"
density = TRUE
circuit = /obj/item/circuitboard/machine/big_manipulator
greyscale_colors = "#d8ce13"
greyscale_config = /datum/greyscale_config/big_manipulator
/// How many time manipulator need to take and drop item.
var/working_speed = 2 SECONDS
/// Using high tier manipulators speeds up big manipulator and requires more energy.
var/power_use_lvl = 0.2
/// When manipulator already working with item inside he don't take any new items.
var/on_work = FALSE
/// Activate mechanism.
var/on = FALSE
/// Dir to get turf where we take items.
var/take_here = NORTH
/// Dir to get turf where we drop items.
var/drop_here = SOUTH
/// Turf where we take items.
var/turf/take_turf
/// Turf where we drop items.
var/turf/drop_turf
/// Obj inside manipulator.
var/datum/weakref/containment_obj
/// Other manipulator component.
var/obj/effect/manipulator_hand
/obj/machinery/big_manipulator/Initialize(mapload)
. = ..()
take_and_drop_turfs_check()
create_manipulator_hand()
RegisterSignal(manipulator_hand, COMSIG_QDELETING, PROC_REF(on_hand_qdel))
manipulator_lvl()
if(on)
press_on(pressed_by = null)
/obj/machinery/big_manipulator/examine(mob/user)
. = ..()
. += "You can change direction with alternative wrench usage."
/obj/machinery/big_manipulator/Destroy(force)
. = ..()
qdel(manipulator_hand)
if(isnull(containment_obj))
return
var/obj/obj_resolve = containment_obj?.resolve()
obj_resolve?.forceMove(get_turf(obj_resolve))
/obj/machinery/big_manipulator/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
take_and_drop_turfs_check()
if(isnull(get_turf(src)))
qdel(manipulator_hand)
return
if(!manipulator_hand)
create_manipulator_hand()
manipulator_hand.forceMove(get_turf(src))
/obj/machinery/big_manipulator/wrench_act(mob/living/user, obj/item/tool)
. = ..()
default_unfasten_wrench(user, tool, time = 1 SECONDS)
return ITEM_INTERACT_SUCCESS
/obj/machinery/big_manipulator/wrench_act_secondary(mob/living/user, obj/item/tool)
. = ..()
if(on_work || on)
to_chat(user, span_warning("[src] is activated!"))
return ITEM_INTERACT_BLOCKING
rotate_big_hand()
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
return ITEM_INTERACT_SUCCESS
/obj/machinery/big_manipulator/can_be_unfasten_wrench(mob/user, silent)
if(on_work || on)
to_chat(user, span_warning("[src] is activated!"))
return FAILED_UNFASTEN
return ..()
/obj/machinery/big_manipulator/default_unfasten_wrench(mob/user, obj/item/wrench, time)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
take_and_drop_turfs_check()
/obj/machinery/big_manipulator/screwdriver_act(mob/living/user, obj/item/tool)
if(default_deconstruction_screwdriver(user, icon_state, icon_state, tool))
return ITEM_INTERACT_SUCCESS
return ITEM_INTERACT_BLOCKING
/obj/machinery/big_manipulator/crowbar_act(mob/living/user, obj/item/tool)
. = ..()
if(default_deconstruction_crowbar(tool))
return ITEM_INTERACT_SUCCESS
return ITEM_INTERACT_BLOCKING
/obj/machinery/big_manipulator/RefreshParts()
. = ..()
manipulator_lvl()
/// Creat manipulator hand effect on manipulator core.
/obj/machinery/big_manipulator/proc/create_manipulator_hand()
manipulator_hand = new/obj/effect/big_manipulator_hand(get_turf(src))
manipulator_hand.dir = take_here
/// Check servo tier and change manipulator speed, power_use and colour.
/obj/machinery/big_manipulator/proc/manipulator_lvl()
var/datum/stock_part/servo/locate_servo = locate() in component_parts
if(!locate_servo)
return
switch(locate_servo.tier)
if(-INFINITY to 1)
working_speed = 2 SECONDS
power_use_lvl = 0.2
set_greyscale(COLOR_YELLOW)
manipulator_hand?.set_greyscale(COLOR_YELLOW)
if(2)
working_speed = 1.4 SECONDS
power_use_lvl = 0.4
set_greyscale(COLOR_ORANGE)
manipulator_hand?.set_greyscale(COLOR_ORANGE)
if(3)
working_speed = 0.8 SECONDS
power_use_lvl = 0.6
set_greyscale(COLOR_RED)
manipulator_hand?.set_greyscale(COLOR_RED)
if(4 to INFINITY)
working_speed = 0.2 SECONDS
power_use_lvl = 0.8
set_greyscale(COLOR_PURPLE)
manipulator_hand?.set_greyscale(COLOR_PURPLE)
active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * power_use_lvl
/// Changing take and drop turf tiles when we anchore manipulator or if manipulator not in turf.
/obj/machinery/big_manipulator/proc/take_and_drop_turfs_check()
if(anchored && isturf(src.loc))
take_turf = get_step(src, take_here)
drop_turf = get_step(src, drop_here)
else
take_turf = null
drop_turf = null
/// Changing take and drop turf dirs and also changing manipulator hand sprite dir.
/obj/machinery/big_manipulator/proc/rotate_big_hand()
switch(take_here)
if(NORTH)
take_here = EAST
drop_here = WEST
if(EAST)
take_here = SOUTH
drop_here = NORTH
if(SOUTH)
take_here = WEST
drop_here = EAST
if(WEST)
take_here = NORTH
drop_here = SOUTH
manipulator_hand.dir = take_here
take_and_drop_turfs_check()
/// Deliting hand will destroy our manipulator core.
/obj/machinery/big_manipulator/proc/on_hand_qdel()
SIGNAL_HANDLER
deconstruct(TRUE)
/// Pre take and drop proc from [take and drop procs loop]:
/// Check if we can start take and drop loop
/obj/machinery/big_manipulator/proc/is_work_check()
if(isclosedturf(drop_turf))
on = !on
say("Output blocked")
return FALSE
for(var/obj/item/take_item in take_turf.contents)
try_take_thing(take_turf, take_item)
break
return TRUE
/// First take and drop proc from [take and drop procs loop]:
/// Check if we can take item from take_turf to work with him. This proc also calling from ATOM_ENTERED signal.
/obj/machinery/big_manipulator/proc/try_take_thing(datum/source, atom/movable/target)
SIGNAL_HANDLER
if(!on)
return
if(!anchored)
return
if(QDELETED(source) || QDELETED(target))
return
if(!isturf(target.loc))
return
if(on_work)
return
if(!use_energy(active_power_usage, force = FALSE))
on = FALSE
say("Not enough energy!")
return
if(isitem(target))
start_work(target)
/// Second take and drop proc from [take and drop procs loop]:
/// Taking our item and start manipulator hand rotate animation.
/obj/machinery/big_manipulator/proc/start_work(atom/movable/target)
target.forceMove(src)
containment_obj = WEAKREF(target)
on_work = TRUE
do_rotate_animation(1)
addtimer(CALLBACK(src, PROC_REF(drop_thing), target), working_speed)
/// Third take and drop proc from [take and drop procs loop]:
/// Drop our item and start manipulator hand backward animation.
/obj/machinery/big_manipulator/proc/drop_thing(atom/movable/target)
target.forceMove(drop_turf)
do_rotate_animation(0)
addtimer(CALLBACK(src, PROC_REF(end_work)), working_speed)
/// Fourth and last take and drop proc from [take and drop procs loop]:
/// Finishes work and begins to look for a new item for [take and drop procs loop].
/obj/machinery/big_manipulator/proc/end_work()
on_work = FALSE
is_work_check()
/// Rotates manipulator hand 90 degrees.
/obj/machinery/big_manipulator/proc/do_rotate_animation(backward)
animate(manipulator_hand, transform = matrix(90, MATRIX_ROTATE), working_speed*0.5)
addtimer(CALLBACK(src, PROC_REF(finish_rotate_animation), backward), working_speed*0.5)
/// Rotates manipulator hand from 90 degrees to 180 or 0 if backward.
/obj/machinery/big_manipulator/proc/finish_rotate_animation(backward)
animate(manipulator_hand, transform = matrix(180 * backward, MATRIX_ROTATE), working_speed*0.5)
/// Proc call when we press on/off button
/obj/machinery/big_manipulator/proc/press_on(pressed_by)
if(pressed_by)
on = !on
if(!is_work_check())
return
if(on)
RegisterSignal(take_turf, COMSIG_ATOM_ENTERED, PROC_REF(try_take_thing))
else
UnregisterSignal(take_turf, COMSIG_ATOM_ENTERED)
/obj/machinery/big_manipulator/ui_interact(mob/user, datum/tgui/ui)
if(!anchored)
to_chat(user, span_warning("[src] isn't attached to the ground!"))
ui?.close()
return
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "BigManipulator")
ui.open()
/obj/machinery/big_manipulator/ui_data(mob/user)
var/list/data = list()
data["active"] = on
return data
/obj/machinery/big_manipulator/ui_act(action, params, datum/tgui/ui)
. = ..()
if(.)
return
switch(action)
if("on")
press_on(pressed_by = TRUE)
return TRUE
/// Manipulator hand. Effect we animate to show that the manipulator is working and moving something.
/obj/effect/big_manipulator_hand
name = "Manipulator claw"
desc = "Take and drop objects. Innovation..."
icon = 'icons/obj/machines/big_manipulator_parts/big_manipulator_hand.dmi'
icon_state = "hand"
layer = LOW_ITEM_LAYER
anchored = TRUE
greyscale_config = /datum/greyscale_config/manipulator_hand
pixel_x = -32
pixel_y = -32
@@ -1712,3 +1712,11 @@
/datum/stock_part/capacitor = 2,
/datum/stock_part/micro_laser = 2,
/obj/item/stack/sheet/glass = 1)
/obj/item/circuitboard/machine/big_manipulator
name = "Big Manipulator"
greyscale_colors = CIRCUIT_COLOR_ENGINEERING
build_path = /obj/machinery/big_manipulator
req_components = list(
/datum/stock_part/servo = 1,
)
@@ -1247,3 +1247,13 @@
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_SERVICE
)
departmental_flags = DEPARTMENT_BITFLAG_SERVICE
/datum/design/board/big_manipulator
name = "Big Manipulator Board"
desc = "The circuit board for a big manipulator."
id = "big_manipulator"
build_path = /obj/item/circuitboard/machine/big_manipulator
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING
)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SERVICE
@@ -126,6 +126,7 @@
"firelock_board",
"trapdoor_electronics",
"blast",
"big_manipulator",
"tile_sprayer",
"airlock_painter",
"decal_painter",
Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

+1
View File
@@ -2116,6 +2116,7 @@
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\bank_machine.dm"
#include "code\game\machinery\barsigns.dm"
#include "code\game\machinery\big_manipulator.dm"
#include "code\game\machinery\botlaunchpad.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
@@ -0,0 +1,30 @@
import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import { Button, Section, Stack } from '../components';
import { Window } from '../layouts';
type ManipulatorData = {
active: BooleanLike;
};
export const BigManipulator = (props) => {
const { data, act } = useBackend<ManipulatorData>();
const { active } = data;
return (
<Window title="Manipulator Interface" width={320} height={160}>
<Window.Content>
<Section title="Action panel">
<Stack>
<Button
icon="power-off"
content={active ? 'On' : 'Off'}
selected={active}
onClick={() => act('on')}
/>
</Stack>
</Section>
</Window.Content>
</Window>
);
};