End of LD38
After Width: | Height: | Size: 168 B |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 367 KiB |
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/sheep.png
Before Width: | Height: | Size: 716 B After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 4.3 KiB |
|
@ -1,7 +1,7 @@
|
|||
[application]
|
||||
|
||||
name="Black Sheep"
|
||||
main_scene="res://game.tscn"
|
||||
main_scene="res://menu.tscn"
|
||||
icon="res://icon.png"
|
||||
|
||||
[display]
|
||||
|
@ -10,6 +10,7 @@ driver="GLES2"
|
|||
|
||||
[input]
|
||||
|
||||
ui_button_2=[key(2)]
|
||||
ui_button_1=[key(1)]
|
||||
|
||||
[locale]
|
||||
|
|
|
@ -0,0 +1,282 @@
|
|||
[convert_images]
|
||||
|
||||
action="none"
|
||||
compress_quality=0.7
|
||||
formats="png"
|
||||
shrink=1.0
|
||||
|
||||
[convert_samples]
|
||||
|
||||
action="none"
|
||||
max_hz=44100
|
||||
trim=false
|
||||
|
||||
[convert_scenes]
|
||||
|
||||
convert_text_scenes=true
|
||||
|
||||
[export_filter]
|
||||
|
||||
filter=""
|
||||
filter_exclude=""
|
||||
type="resources"
|
||||
|
||||
[platform:Android]
|
||||
|
||||
apk_expansion/SALT=""
|
||||
apk_expansion/enable=false
|
||||
apk_expansion/public_key=""
|
||||
architecture/arm=true
|
||||
architecture/x86=false
|
||||
command_line/extra_args=""
|
||||
custom_package/debug=""
|
||||
custom_package/release=""
|
||||
debug/debugging_enabled=true
|
||||
keystore/release=""
|
||||
keystore/release_password=""
|
||||
keystore/release_user=""
|
||||
one_click_deploy/clear_previous_install=true
|
||||
package/icon=""
|
||||
package/name=""
|
||||
package/signed=true
|
||||
package/unique_name="org.godotengine.$genname"
|
||||
permissions/access_checkin_properties=false
|
||||
permissions/access_coarse_location=false
|
||||
permissions/access_fine_location=false
|
||||
permissions/access_location_extra_commands=false
|
||||
permissions/access_mock_location=false
|
||||
permissions/access_network_state=false
|
||||
permissions/access_surface_flinger=false
|
||||
permissions/access_wifi_state=false
|
||||
permissions/account_manager=false
|
||||
permissions/add_voicemail=false
|
||||
permissions/authenticate_accounts=false
|
||||
permissions/battery_stats=false
|
||||
permissions/bind_accessibility_service=false
|
||||
permissions/bind_appwidget=false
|
||||
permissions/bind_device_admin=false
|
||||
permissions/bind_input_method=false
|
||||
permissions/bind_nfc_service=false
|
||||
permissions/bind_notification_listener_service=false
|
||||
permissions/bind_print_service=false
|
||||
permissions/bind_remoteviews=false
|
||||
permissions/bind_text_service=false
|
||||
permissions/bind_vpn_service=false
|
||||
permissions/bind_wallpaper=false
|
||||
permissions/bluetooth=false
|
||||
permissions/bluetooth_admin=false
|
||||
permissions/bluetooth_privileged=false
|
||||
permissions/brick=false
|
||||
permissions/broadcast_package_removed=false
|
||||
permissions/broadcast_sms=false
|
||||
permissions/broadcast_sticky=false
|
||||
permissions/broadcast_wap_push=false
|
||||
permissions/call_phone=false
|
||||
permissions/call_privileged=false
|
||||
permissions/camera=false
|
||||
permissions/capture_audio_output=false
|
||||
permissions/capture_secure_video_output=false
|
||||
permissions/capture_video_output=false
|
||||
permissions/change_component_enabled_state=false
|
||||
permissions/change_configuration=false
|
||||
permissions/change_network_state=false
|
||||
permissions/change_wifi_multicast_state=false
|
||||
permissions/change_wifi_state=false
|
||||
permissions/clear_app_cache=false
|
||||
permissions/clear_app_user_data=false
|
||||
permissions/control_location_updates=false
|
||||
permissions/delete_cache_files=false
|
||||
permissions/delete_packages=false
|
||||
permissions/device_power=false
|
||||
permissions/diagnostic=false
|
||||
permissions/disable_keyguard=false
|
||||
permissions/dump=false
|
||||
permissions/expand_status_bar=false
|
||||
permissions/factory_test=false
|
||||
permissions/flashlight=false
|
||||
permissions/force_back=false
|
||||
permissions/get_accounts=false
|
||||
permissions/get_package_size=false
|
||||
permissions/get_tasks=false
|
||||
permissions/get_top_activity_info=false
|
||||
permissions/global_search=false
|
||||
permissions/hardware_test=false
|
||||
permissions/inject_events=false
|
||||
permissions/install_location_provider=false
|
||||
permissions/install_packages=false
|
||||
permissions/install_shortcut=false
|
||||
permissions/internal_system_window=false
|
||||
permissions/internet=false
|
||||
permissions/kill_background_processes=false
|
||||
permissions/location_hardware=false
|
||||
permissions/manage_accounts=false
|
||||
permissions/manage_app_tokens=false
|
||||
permissions/manage_documents=false
|
||||
permissions/master_clear=false
|
||||
permissions/media_content_control=false
|
||||
permissions/modify_audio_settings=false
|
||||
permissions/modify_phone_state=false
|
||||
permissions/mount_format_filesystems=false
|
||||
permissions/mount_unmount_filesystems=false
|
||||
permissions/nfc=false
|
||||
permissions/persistent_activity=false
|
||||
permissions/process_outgoing_calls=false
|
||||
permissions/read_calendar=false
|
||||
permissions/read_call_log=false
|
||||
permissions/read_contacts=false
|
||||
permissions/read_external_storage=false
|
||||
permissions/read_frame_buffer=false
|
||||
permissions/read_history_bookmarks=false
|
||||
permissions/read_input_state=false
|
||||
permissions/read_logs=false
|
||||
permissions/read_phone_state=false
|
||||
permissions/read_profile=false
|
||||
permissions/read_sms=false
|
||||
permissions/read_social_stream=false
|
||||
permissions/read_sync_settings=false
|
||||
permissions/read_sync_stats=false
|
||||
permissions/read_user_dictionary=false
|
||||
permissions/reboot=false
|
||||
permissions/receive_boot_completed=false
|
||||
permissions/receive_mms=false
|
||||
permissions/receive_sms=false
|
||||
permissions/receive_wap_push=false
|
||||
permissions/record_audio=false
|
||||
permissions/reorder_tasks=false
|
||||
permissions/restart_packages=false
|
||||
permissions/send_respond_via_message=false
|
||||
permissions/send_sms=false
|
||||
permissions/set_activity_watcher=false
|
||||
permissions/set_alarm=false
|
||||
permissions/set_always_finish=false
|
||||
permissions/set_animation_scale=false
|
||||
permissions/set_debug_app=false
|
||||
permissions/set_orientation=false
|
||||
permissions/set_pointer_speed=false
|
||||
permissions/set_preferred_applications=false
|
||||
permissions/set_process_limit=false
|
||||
permissions/set_time=false
|
||||
permissions/set_time_zone=false
|
||||
permissions/set_wallpaper=false
|
||||
permissions/set_wallpaper_hints=false
|
||||
permissions/signal_persistent_processes=false
|
||||
permissions/status_bar=false
|
||||
permissions/subscribed_feeds_read=false
|
||||
permissions/subscribed_feeds_write=false
|
||||
permissions/system_alert_window=false
|
||||
permissions/transmit_ir=false
|
||||
permissions/uninstall_shortcut=false
|
||||
permissions/update_device_stats=false
|
||||
permissions/use_credentials=false
|
||||
permissions/use_sip=false
|
||||
permissions/vibrate=false
|
||||
permissions/wake_lock=false
|
||||
permissions/write_apn_settings=false
|
||||
permissions/write_calendar=false
|
||||
permissions/write_call_log=false
|
||||
permissions/write_contacts=false
|
||||
permissions/write_external_storage=false
|
||||
permissions/write_gservices=false
|
||||
permissions/write_history_bookmarks=false
|
||||
permissions/write_profile=false
|
||||
permissions/write_secure_settings=false
|
||||
permissions/write_settings=false
|
||||
permissions/write_sms=false
|
||||
permissions/write_social_stream=false
|
||||
permissions/write_sync_settings=false
|
||||
permissions/write_user_dictionary=false
|
||||
screen/immersive_mode=true
|
||||
screen/orientation=0
|
||||
screen/support_large=true
|
||||
screen/support_normal=true
|
||||
screen/support_small=true
|
||||
screen/support_xlarge=true
|
||||
screen/use_32_bits_view=true
|
||||
user_permissions/0=""
|
||||
user_permissions/1=""
|
||||
user_permissions/10=""
|
||||
user_permissions/11=""
|
||||
user_permissions/12=""
|
||||
user_permissions/13=""
|
||||
user_permissions/14=""
|
||||
user_permissions/15=""
|
||||
user_permissions/16=""
|
||||
user_permissions/17=""
|
||||
user_permissions/18=""
|
||||
user_permissions/19=""
|
||||
user_permissions/2=""
|
||||
user_permissions/3=""
|
||||
user_permissions/4=""
|
||||
user_permissions/5=""
|
||||
user_permissions/6=""
|
||||
user_permissions/7=""
|
||||
user_permissions/8=""
|
||||
user_permissions/9=""
|
||||
version/code=1
|
||||
version/name="1.0"
|
||||
|
||||
[platform:BlackBerry 10]
|
||||
|
||||
debug/debugging_enabled=true
|
||||
package/category="core.games"
|
||||
package/custom_template=""
|
||||
package/description="Game made with Godot Engine"
|
||||
package/icon=""
|
||||
package/name=""
|
||||
package/unique_name="com.godot.noname"
|
||||
release/author="Cert. Name"
|
||||
release/author_id="Cert. ID"
|
||||
version/code=1
|
||||
version/name="1.0"
|
||||
|
||||
[platform:HTML5]
|
||||
|
||||
browser/enable_run=false
|
||||
custom_package/debug=""
|
||||
custom_package/release=""
|
||||
debug/debugging_enabled=true
|
||||
html/controls_enabled=true
|
||||
html/font_family="arial,sans-serif"
|
||||
html/head_include=""
|
||||
html/style_include=""
|
||||
html/title=""
|
||||
options/memory_size=3
|
||||
|
||||
[platform:Linux X11]
|
||||
|
||||
binary/64_bits=true
|
||||
custom_binary/debug=""
|
||||
custom_binary/release=""
|
||||
debug/debugging_enabled=true
|
||||
resources/bundle_dependencies_(for_optical_disc)=true
|
||||
resources/pack_mode=0
|
||||
|
||||
[platform:Mac OSX]
|
||||
|
||||
application/bits_mode=0
|
||||
application/copyright=""
|
||||
application/icon=""
|
||||
application/identifier="org.godotengine.macgame"
|
||||
application/info="Made with Godot Engine"
|
||||
application/name=""
|
||||
application/short_version="1.0"
|
||||
application/signature="godotmacgame"
|
||||
application/version="1.0"
|
||||
custom_package/debug=""
|
||||
custom_package/release=""
|
||||
debug/debugging_enabled=true
|
||||
display/high_res=false
|
||||
|
||||
[platform:Windows Desktop]
|
||||
|
||||
binary/64_bits=true
|
||||
custom_binary/debug=""
|
||||
custom_binary/release=""
|
||||
debug/debugging_enabled=true
|
||||
resources/bundle_dependencies_(for_optical_disc)=false
|
||||
resources/pack_mode=1
|
||||
|
||||
[script]
|
||||
|
||||
action="compile"
|
||||
encrypt_key=""
|
|
@ -66,9 +66,9 @@ focus/stop_mouse = true
|
|||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = -18.0
|
||||
margin/top = -15.0
|
||||
margin/top = -20.0
|
||||
margin/right = 22.0
|
||||
margin/bottom = 1.0
|
||||
margin/bottom = -4.0
|
||||
range/min = 0.0
|
||||
range/max = 50.0
|
||||
range/step = 1.0
|
||||
|
|
145
game.gd
|
@ -6,7 +6,12 @@ signal player_action(action)
|
|||
# Consts
|
||||
const TIME_LIMIT = 60.0
|
||||
const TimeLeftTooltipFormat = "Shearing in %fm%ds"
|
||||
|
||||
const FLOCK_SIZE = 18
|
||||
const FLOCK_MIN_TIME = 5
|
||||
const FLOCK_MAX_TIME = 20
|
||||
const MIN_GRASS = 5
|
||||
const MAX_GRASS = 9
|
||||
const SUSPICION_AWAY_FROM_FLOCK = 0.015
|
||||
# Member variables
|
||||
#var screen_size
|
||||
var time_to_shearing = TIME_LIMIT # Time left in seconds
|
||||
|
@ -14,39 +19,149 @@ var suspicion = 0
|
|||
var max_suspicion = 100
|
||||
var highest_suspicion = 0
|
||||
var suspicion_loss = 1 # per second
|
||||
var flock_timer = 0
|
||||
var flock_destination = Vector2()
|
||||
var process_logic = true
|
||||
|
||||
func _ready():
|
||||
get_node("TimeLeftBar").set_max(TIME_LIMIT)
|
||||
get_node("TimeLeftBar").set_value(TIME_LIMIT)
|
||||
get_node("SuspicionBar").set_max(max_suspicion)
|
||||
get_node("SuspicionBar").set_value(suspicion)
|
||||
get_node("ToolBar/RamButton").connect("pressed", self, "_on_ram_pressed")
|
||||
set_process(true)
|
||||
randomize()
|
||||
get_node("HUD/TimeLeftBar").set_max(TIME_LIMIT)
|
||||
get_node("HUD/TimeLeftBar").set_value(TIME_LIMIT)
|
||||
get_node("HUD/SuspicionBar").set_max(max_suspicion)
|
||||
get_node("HUD/SuspicionBar").set_value(suspicion)
|
||||
get_node("HUD/ToolBar/RamButton").connect("pressed", self, "_on_ram_pressed")
|
||||
get_node("HUD/ToolBar/EatButton").connect("pressed", self, "_on_eat_pressed")
|
||||
var i = 0
|
||||
|
||||
var sheep = preload("res://sheep.tscn")
|
||||
var grass = preload("res://grass.tscn")
|
||||
var pen_tl = get_node("Level/Pen/Spawn-TL")
|
||||
var pen_br = get_node("Level/Pen/Spawn-BR")
|
||||
while i < FLOCK_SIZE:
|
||||
var node = sheep.instance()
|
||||
node.set_pos(spawn_in_area(pen_tl, pen_br))
|
||||
node.add_to_group('flock')
|
||||
get_node("Actors").add_child(node)
|
||||
i += 1
|
||||
i = 0
|
||||
while i < int(rand_range(MIN_GRASS, MAX_GRASS)):
|
||||
var node = grass.instance()
|
||||
node.set_pos(spawn_in_area(pen_tl, pen_br))
|
||||
node.add_to_group('grass')
|
||||
get_node("Level").add_child(node)
|
||||
i += 1
|
||||
set_process(true)
|
||||
|
||||
func spawn_in_area(tl, br):
|
||||
var min_x = tl.get_global_pos().x
|
||||
var max_x = br.get_global_pos().x
|
||||
var min_y = tl.get_global_pos().y
|
||||
var max_y = br.get_global_pos().y
|
||||
return Vector2(rand_range(min_x, max_x), rand_range(min_y, max_y))
|
||||
|
||||
func _process(delta):
|
||||
if not process_logic:
|
||||
return
|
||||
time_to_shearing -= delta
|
||||
var time_left = get_node("TimeLeftBar")
|
||||
var time_left = get_node("HUD/TimeLeftBar")
|
||||
time_left.set_value(time_to_shearing)
|
||||
var time_left_minute = floor(time_to_shearing / 60)
|
||||
var time_left_second = time_to_shearing - (time_left_minute * 60)
|
||||
var tooltip = TimeLeftTooltipFormat % [time_left_minute, time_left_second]
|
||||
time_left.set_tooltip(tooltip)
|
||||
if time_to_shearing < 0:
|
||||
game_over("Too late : the shearing is upon us!")
|
||||
|
||||
update_suspicion(-delta * suspicion_loss)
|
||||
var suspicion_bar = get_node('SuspicionBar')
|
||||
suspicion_bar.set_value(suspicion)
|
||||
var d_suspicion = -delta * suspicion_loss
|
||||
if flock_timer > 0:
|
||||
var suspicion_per_pixel = SUSPICION_AWAY_FROM_FLOCK
|
||||
var d = get_node("Actors/player").get_global_pos().distance_to(flock_destination)
|
||||
var flock_distance = get_node("Actors/player").get_global_pos().distance_to(avg_flock_location())
|
||||
#print("Distance from point: ", d)
|
||||
#print("Distance from flock center: ", flock_distance)
|
||||
d_suspicion += suspicion_per_pixel * (flock_distance-200) * delta
|
||||
update_suspicion(d_suspicion)
|
||||
|
||||
if flock_timer > 0:
|
||||
flock_timer -= delta
|
||||
if flock_timer < 0:
|
||||
flock(false)
|
||||
flock_timer = 0
|
||||
|
||||
if int(time_to_shearing) % 15 == 0 && flock_timer == 0:
|
||||
#print("Starting flock")
|
||||
flock(true)
|
||||
|
||||
func _on_ram_pressed():
|
||||
emit_signal("player_action", "ram")
|
||||
|
||||
func _on_eat_pressed():
|
||||
emit_signal("player_action", "eat")
|
||||
|
||||
func update_suspicion(amount):
|
||||
suspicion += amount
|
||||
var suspicion_bar = get_node('HUD/SuspicionBar')
|
||||
suspicion_bar.set_value(suspicion)
|
||||
if (suspicion > highest_suspicion):
|
||||
highest_suspicion = suspicion
|
||||
if suspicion < 0:
|
||||
suspicion = 0
|
||||
if (suspicion > max_suspicion):
|
||||
print("argh")
|
||||
get_node("PostGameMessage/Label").set_text("Oh no!\n You were too suspicious and the farmer came for you :o")
|
||||
get_node("PostGameMessage").show()
|
||||
set_process(false)
|
||||
game_over('You were too suspicious: the farmer came for you!')
|
||||
|
||||
func game_over(message, failure = true):
|
||||
var n = get_node("HUD/Panel/PostGameMessage/Label")
|
||||
if failure:
|
||||
n.set_text("Oh no!\n%s" %[message])
|
||||
else:
|
||||
n.set_text("YEAH!!!\n%s" %[message])
|
||||
get_node("HUD/Panel").show()
|
||||
get_node("Actors/player").set_fixed_process(false)
|
||||
process_logic = false
|
||||
flock(false)
|
||||
|
||||
func avg_flock_location():
|
||||
var p = null
|
||||
for i in get_tree().get_nodes_in_group('flock'):
|
||||
if p == null:
|
||||
p = i.get_global_pos()
|
||||
continue
|
||||
p += i.get_global_pos()
|
||||
return p / get_tree().get_nodes_in_group('flock').size()
|
||||
|
||||
func flock(enable = true):
|
||||
if not enable:
|
||||
#print("Flocking stopped")
|
||||
for i in get_tree().get_nodes_in_group('flock'):
|
||||
i.flock(null, false)
|
||||
return
|
||||
var p = randf()
|
||||
var i = 0
|
||||
var d = Vector2()
|
||||
var points = get_node("Level/FlockPoints").get_children();
|
||||
var point_count = get_node("Level/FlockPoints").get_child_count()
|
||||
#print(p)
|
||||
for point in points:
|
||||
if p >= (float(i)/float(point_count)) and p <= (float((i+1)) / float(point_count)):
|
||||
d = point.get_global_pos()
|
||||
flock_destination = d
|
||||
#print("Flocking to ", d)
|
||||
i += 1
|
||||
for i in get_tree().get_nodes_in_group('flock'):
|
||||
i.flock(d)
|
||||
flock_timer = rand_range(FLOCK_MIN_TIME, FLOCK_MAX_TIME)
|
||||
|
||||
func _on_Replay_released():
|
||||
#print('replay pressed')
|
||||
get_tree().change_scene("res://game.tscn")
|
||||
|
||||
func _on_Quit_released():
|
||||
#print('quit pressed')
|
||||
get_tree().quit()
|
||||
|
||||
|
||||
func _on_Quit_pressed():
|
||||
_on_Quit_released()
|
||||
|
||||
func _on_Replay_pressed():
|
||||
_on_Replay_released()
|
||||
|
|
217
game.tscn
|
@ -1,39 +1,37 @@
|
|||
[gd_scene load_steps=8 format=1]
|
||||
[gd_scene load_steps=9 format=1]
|
||||
|
||||
[ext_resource path="res://game.gd" type="Script" id=1]
|
||||
[ext_resource path="res://player.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://sheep.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://pen.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://assets/progress.png" type="Texture" id=5]
|
||||
[ext_resource path="res://scripts/button_ram.gd" type="Script" id=6]
|
||||
[ext_resource path="res://assets/progress_suspicion.png" type="Texture" id=7]
|
||||
[ext_resource path="res://assets/black.png" type="Texture" id=2]
|
||||
[ext_resource path="res://assets/progress.png" type="Texture" id=3]
|
||||
[ext_resource path="res://assets/progress_suspicion.png" type="Texture" id=4]
|
||||
[ext_resource path="res://scripts/button_ram.gd" type="Script" id=5]
|
||||
[ext_resource path="res://scripts/eat_button.gd" type="Script" id=6]
|
||||
[ext_resource path="res://pen.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://player.tscn" type="PackedScene" id=8]
|
||||
|
||||
[node name="game" type="Node2D"]
|
||||
|
||||
transform/pos = Vector2( 31.9212, 31.9212 )
|
||||
script/script = ExtResource( 1 )
|
||||
|
||||
[node name="player" parent="." instance=ExtResource( 2 )]
|
||||
[node name="HUD" type="CanvasLayer" parent="."]
|
||||
|
||||
[node name="KinematicBody2D" parent="." instance=ExtResource( 3 )]
|
||||
layer = 2
|
||||
offset = Vector2( 0, 0 )
|
||||
rotation = 0.0
|
||||
scale = Vector2( 1, 1 )
|
||||
|
||||
transform/pos = Vector2( 357.813, 107.447 )
|
||||
|
||||
[node name="Node2D" parent="." instance=ExtResource( 4 )]
|
||||
|
||||
transform/pos = Vector2( 143.027, 243.104 )
|
||||
|
||||
[node name="TimeLeftBar" type="TextureProgress" parent="."]
|
||||
[node name="TimeLeftBar" type="TextureProgress" parent="HUD"]
|
||||
|
||||
rect/scale = Vector2( 1, 10 )
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 932.0
|
||||
margin/top = 23.0
|
||||
margin/right = 982.0
|
||||
margin/bottom = 73.0
|
||||
margin/left = 967.0
|
||||
margin/top = 96.0
|
||||
margin/right = 1017.0
|
||||
margin/bottom = 146.0
|
||||
range/min = 0.0
|
||||
range/max = 100.0
|
||||
range/step = 0.1
|
||||
|
@ -41,14 +39,39 @@ range/page = 0.0
|
|||
range/value = 100.0
|
||||
range/exp_edit = false
|
||||
range/rounded = false
|
||||
texture/under = null
|
||||
texture/under = ExtResource( 2 )
|
||||
texture/over = null
|
||||
texture/progress = ExtResource( 5 )
|
||||
texture/progress = ExtResource( 3 )
|
||||
mode = 3
|
||||
radial_fill/fill_degrees = 360.0
|
||||
radial_fill/center_offset = Vector2( 0, 0 )
|
||||
|
||||
[node name="ToolBar" type="HButtonArray" parent="."]
|
||||
[node name="SuspicionBar" type="TextureProgress" parent="HUD"]
|
||||
|
||||
visibility/behind_parent = true
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 966.0
|
||||
margin/top = 25.0
|
||||
margin/right = 1016.0
|
||||
margin/bottom = 75.0
|
||||
range/min = 0.0
|
||||
range/max = 100.0
|
||||
range/step = 0.1
|
||||
range/page = 0.0
|
||||
range/value = 100.0
|
||||
range/exp_edit = false
|
||||
range/rounded = false
|
||||
texture/under = ExtResource( 2 )
|
||||
texture/over = null
|
||||
texture/progress = ExtResource( 4 )
|
||||
mode = 3
|
||||
radial_fill/fill_degrees = 360.0
|
||||
radial_fill/center_offset = Vector2( 0, 0 )
|
||||
|
||||
[node name="ToolBar" type="HButtonArray" parent="HUD"]
|
||||
|
||||
anchor/left = 3
|
||||
anchor/right = 3
|
||||
|
@ -56,16 +79,16 @@ focus/ignore_mouse = false
|
|||
focus/stop_mouse = false
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = -216.0
|
||||
margin/top = 522.0
|
||||
margin/right = -702.0
|
||||
margin/bottom = 562.0
|
||||
margin/left = 232.079
|
||||
margin/top = 553.921
|
||||
margin/right = -253.921
|
||||
margin/bottom = 593.921
|
||||
flat = false
|
||||
button/count = 0
|
||||
button/min_button_size = -1.0
|
||||
button/align = 112
|
||||
|
||||
[node name="RamButton" type="ToolButton" parent="ToolBar"]
|
||||
[node name="RamButton" type="ToolButton" parent="HUD/ToolBar"]
|
||||
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
|
@ -80,52 +103,134 @@ enabled_focus_mode = 2
|
|||
shortcut = null
|
||||
text = "Ram"
|
||||
flat = true
|
||||
script/script = ExtResource( 6 )
|
||||
script/script = ExtResource( 5 )
|
||||
|
||||
[node name="SuspicionBar" type="TextureProgress" parent="."]
|
||||
[node name="EatButton" type="ToolButton" parent="HUD/ToolBar"]
|
||||
|
||||
rect/scale = Vector2( 1, 10 )
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = -30.0
|
||||
margin/top = 16.0
|
||||
margin/right = 20.0
|
||||
margin/bottom = 66.0
|
||||
range/min = 0.0
|
||||
range/max = 100.0
|
||||
range/step = 0.1
|
||||
range/page = 0.0
|
||||
range/value = 100.0
|
||||
range/exp_edit = false
|
||||
range/rounded = false
|
||||
texture/under = null
|
||||
texture/over = null
|
||||
texture/progress = ExtResource( 7 )
|
||||
mode = 3
|
||||
radial_fill/fill_degrees = 360.0
|
||||
radial_fill/center_offset = Vector2( 0, 0 )
|
||||
margin/left = 58.0
|
||||
margin/top = 1.0
|
||||
margin/right = 89.0
|
||||
margin/bottom = 23.0
|
||||
toggle_mode = false
|
||||
enabled_focus_mode = 2
|
||||
shortcut = null
|
||||
text = "Eat"
|
||||
flat = true
|
||||
script/script = ExtResource( 6 )
|
||||
|
||||
[node name="PostGameMessage" type="Node2D" parent="."]
|
||||
[node name="Panel" type="Panel" parent="HUD"]
|
||||
|
||||
visibility/visible = false
|
||||
transform/pos = Vector2( 474.838, 236.982 )
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 312.0
|
||||
margin/top = 200.0
|
||||
margin/right = 712.0
|
||||
margin/bottom = 400.0
|
||||
|
||||
[node name="Label" type="Label" parent="PostGameMessage"]
|
||||
[node name="PostGameMessage" type="Node2D" parent="HUD/Panel"]
|
||||
|
||||
transform/pos = Vector2( 32, 32 )
|
||||
|
||||
[node name="Label" type="Label" parent="HUD/Panel/PostGameMessage"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = 0.0
|
||||
margin/top = 0.0
|
||||
margin/right = 40.0
|
||||
margin/bottom = 14.0
|
||||
margin/left = -27.0
|
||||
margin/top = -27.0
|
||||
margin/right = 363.0
|
||||
margin/bottom = 63.0
|
||||
percent_visible = 1.0
|
||||
lines_skipped = 0
|
||||
max_lines_visible = -1
|
||||
|
||||
[connection signal="player_action" from="." to="player" method="_on_game_player_action"]
|
||||
[node name="Replay" type="Button" parent="HUD/Panel"]
|
||||
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 0.0
|
||||
margin/top = 100.0
|
||||
margin/right = 200.0
|
||||
margin/bottom = 200.0
|
||||
toggle_mode = false
|
||||
enabled_focus_mode = 2
|
||||
shortcut = null
|
||||
text = "Replay"
|
||||
flat = false
|
||||
|
||||
[node name="Quit" type="Button" parent="HUD/Panel"]
|
||||
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 200.0
|
||||
margin/top = 100.0
|
||||
margin/right = 400.0
|
||||
margin/bottom = 200.0
|
||||
toggle_mode = false
|
||||
enabled_focus_mode = 2
|
||||
shortcut = null
|
||||
text = "Quit"
|
||||
flat = false
|
||||
|
||||
[node name="Level" type="Node" parent="."]
|
||||
|
||||
[node name="Pen" parent="Level" instance=ExtResource( 7 )]
|
||||
|
||||
transform/pos = Vector2( 174.948, 275.025 )
|
||||
|
||||
[node name="FlockPoints" type="Node2D" parent="Level"]
|
||||
|
||||
editor/display_folded = true
|
||||
transform/pos = Vector2( 31.9212, 31.9212 )
|
||||
|
||||
[node name="1" type="Node2D" parent="Level/FlockPoints"]
|
||||
|
||||
transform/pos = Vector2( 475.346, 230.471 )
|
||||
|
||||
[node name="2" type="Node2D" parent="Level/FlockPoints"]
|
||||
|
||||
transform/pos = Vector2( 842.105, 103.047 )
|
||||
|
||||
[node name="3" type="Node2D" parent="Level/FlockPoints"]
|
||||
|
||||
transform/pos = Vector2( 844.321, 387.812 )
|
||||
|
||||
[node name="4" type="Node2D" parent="Level/FlockPoints"]
|
||||
|
||||
transform/pos = Vector2( 88.6427, 390.028 )
|
||||
|
||||
[node name="5" type="Node2D" parent="Level/FlockPoints"]
|
||||
|
||||
transform/pos = Vector2( 84.2105, 96.3989 )
|
||||
|
||||
[node name="Actors" type="Node" parent="."]
|
||||
|
||||
[node name="player" parent="Actors" groups=[
|
||||
"Player",
|
||||
] instance=ExtResource( 8 )]
|
||||
|
||||
transform/pos = Vector2( 500.917, 367.093 )
|
||||
|
||||
[connection signal="player_action" from="." to="Actors/player" method="_on_game_player_action"]
|
||||
|
||||
[connection signal="pressed" from="HUD/Panel/Replay" to="." method="_on_Replay_pressed"]
|
||||
|
||||
[connection signal="released" from="HUD/Panel/Replay" to="." method="_on_Replay_released"]
|
||||
|
||||
[connection signal="pressed" from="HUD/Panel/Quit" to="." method="_on_Quit_pressed"]
|
||||
|
||||
[connection signal="released" from="HUD/Panel/Quit" to="." method="_on_Quit_released"]
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
extends Node2D
|
||||
|
||||
# class member variables go here, for example:
|
||||
# var a = 2
|
||||
# var b = "textvar"
|
||||
|
||||
func _ready():
|
||||
# Called every time the node is added to the scene.
|
||||
# Initialization here
|
||||
pass
|
||||
|
||||
func is_eatable():
|
||||
return true
|
||||
|
||||
func eat(eater):
|
||||
eater.turd_count += 1
|
||||
eater.strength += 1
|
||||
queue_free()
|
|
@ -0,0 +1,37 @@
|
|||
[gd_scene load_steps=4 format=1]
|
||||
|
||||
[ext_resource path="res://grass.gd" type="Script" id=1]
|
||||
[ext_resource path="res://assets/grass.png" type="Texture" id=2]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=1]
|
||||
|
||||
custom_solver_bias = 0.0
|
||||
extents = Vector2( 10, 10 )
|
||||
|
||||
[node name="Node2D" type="Node2D"]
|
||||
|
||||
script/script = ExtResource( 1 )
|
||||
|
||||
[node name="Area2D" type="Area2D" parent="."]
|
||||
|
||||
input/pickable = true
|
||||
shapes/0/shape = SubResource( 1 )
|
||||
shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
|
||||
shapes/0/trigger = false
|
||||
gravity_vec = Vector2( 0, 1 )
|
||||
gravity = 98.0
|
||||
linear_damp = 0.1
|
||||
angular_damp = 1.0
|
||||
monitoring = false
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
|
||||
|
||||
shape = SubResource( 1 )
|
||||
trigger = false
|
||||
_update_shape_index = 0
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
extends Node
|
||||
|
||||
# class member variables go here, for example:
|
||||
# var a = 2
|
||||
# var b = "textvar"
|
||||
|
||||
func _ready():
|
||||
# Called every time the node is added to the scene.
|
||||
# Initialization here
|
||||
pass
|
||||
|
||||
|
||||
func _on_Quit_released():
|
||||
get_tree().quit()
|
||||
|
||||
|
||||
func _on_Play_released():
|
||||
get_tree().change_scene("res://game.tscn")
|
|
@ -0,0 +1,194 @@
|
|||
[gd_scene load_steps=4 format=1]
|
||||
|
||||
[ext_resource path="res://menu.gd" type="Script" id=1]
|
||||
[ext_resource path="res://assets/main_menu_bg.png" type="Texture" id=2]
|
||||
[ext_resource path="res://assets/title.png" type="Texture" id=3]
|
||||
|
||||
[node name="Node" type="Node"]
|
||||
|
||||
script/script = ExtResource( 1 )
|
||||
|
||||
[node name="Background" type="CanvasLayer" parent="."]
|
||||
|
||||
layer = 1
|
||||
offset = Vector2( 0, 0 )
|
||||
rotation = 0.0
|
||||
scale = Vector2( 1, 1 )
|
||||
|
||||
[node name="TextureFrame" type="TextureFrame" parent="Background"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = -1.0
|
||||
margin/top = 0.0
|
||||
margin/right = 1023.0
|
||||
margin/bottom = 600.0
|
||||
texture = ExtResource( 2 )
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="Foreground" type="CanvasLayer" parent="."]
|
||||
|
||||
layer = 2
|
||||
offset = Vector2( 0, 0 )
|
||||
rotation = 0.0
|
||||
scale = Vector2( 1, 1 )
|
||||
|
||||
[node name="Title" type="TextureFrame" parent="Foreground"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 312.0
|
||||
margin/top = 50.0
|
||||
margin/right = 712.0
|
||||
margin/bottom = 250.0
|
||||
texture = ExtResource( 3 )
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="Play" type="Button" parent="Foreground"]
|
||||
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 362.0
|
||||
margin/top = 275.0
|
||||
margin/right = 662.0
|
||||
margin/bottom = 375.0
|
||||
toggle_mode = false
|
||||
click_on_press = true
|
||||
enabled_focus_mode = 2
|
||||
shortcut = null
|
||||
text = "Play"
|
||||
flat = false
|
||||
|
||||
[node name="Quit" type="Button" parent="Foreground"]
|
||||
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 362.0
|
||||
margin/top = 400.0
|
||||
margin/right = 662.0
|
||||
margin/bottom = 500.0
|
||||
toggle_mode = false
|
||||
click_on_press = true
|
||||
enabled_focus_mode = 2
|
||||
shortcut = null
|
||||
text = "Quit"
|
||||
flat = false
|
||||
|
||||
[node name="Panel" type="Panel" parent="Foreground"]
|
||||
|
||||
focus/ignore_mouse = false
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 2
|
||||
margin/left = 836.0
|
||||
margin/top = 106.0
|
||||
margin/right = 986.0
|
||||
margin/bottom = 416.0
|
||||
|
||||
[node name="Label" type="Label" parent="Foreground/Panel"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = 45.0
|
||||
margin/top = 20.0
|
||||
margin/right = 98.0
|
||||
margin/bottom = 51.0
|
||||
text = "Controls"
|
||||
percent_visible = 1.0
|
||||
lines_skipped = 0
|
||||
max_lines_visible = -1
|
||||
|
||||
[node name="Label1" type="Label" parent="Foreground/Panel"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = 40.0
|
||||
margin/top = 135.0
|
||||
margin/right = 108.0
|
||||
margin/bottom = 166.0
|
||||
text = "Conditions"
|
||||
percent_visible = 1.0
|
||||
lines_skipped = 0
|
||||
max_lines_visible = -1
|
||||
|
||||
[node name="Label 2" type="Label" parent="Foreground/Panel"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = 5.0
|
||||
margin/top = 50.0
|
||||
margin/right = 145.0
|
||||
margin/bottom = 95.0
|
||||
text = "(1) Ram : Damage fences"
|
||||
autowrap = true
|
||||
percent_visible = 1.0
|
||||
lines_skipped = 0
|
||||
max_lines_visible = -1
|
||||
|
||||
[node name="Label3" type="Label" parent="Foreground/Panel"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = 5.0
|
||||
margin/top = 85.0
|
||||
margin/right = 145.0
|
||||
margin/bottom = 130.0
|
||||
text = "(2) Eat : Grass make you stronger"
|
||||
autowrap = true
|
||||
percent_visible = 1.0
|
||||
lines_skipped = 0
|
||||
max_lines_visible = -1
|
||||
|
||||
[node name="Label4" type="Label" parent="Foreground/Panel"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = 5.0
|
||||
margin/top = 155.0
|
||||
margin/right = 145.0
|
||||
margin/bottom = 230.0
|
||||
text = "Don't become too suspicious - the farmer will come for you. Act like a sheep."
|
||||
autowrap = true
|
||||
percent_visible = 1.0
|
||||
lines_skipped = 0
|
||||
max_lines_visible = -1
|
||||
|
||||
[node name="Label5" type="Label" parent="Foreground/Panel"]
|
||||
|
||||
focus/ignore_mouse = true
|
||||
focus/stop_mouse = true
|
||||
size_flags/horizontal = 2
|
||||
size_flags/vertical = 0
|
||||
margin/left = 5.0
|
||||
margin/top = 235.0
|
||||
margin/right = 145.0
|
||||
margin/bottom = 310.0
|
||||
text = "Get out of the pen and off the screen before the time runs out."
|
||||
autowrap = true
|
||||
percent_visible = 1.0
|
||||
lines_skipped = 0
|
||||
max_lines_visible = -1
|
||||
|
||||
[connection signal="released" from="Foreground/Play" to="." method="_on_Play_released"]
|
||||
|
||||
[connection signal="released" from="Foreground/Quit" to="." method="_on_Quit_released"]
|
||||
|
||||
|
8
pen.tscn
|
@ -250,4 +250,12 @@ transform/rot = -90.0
|
|||
transform/pos = Vector2( 715.607, 194.462 )
|
||||
transform/rot = -90.0
|
||||
|
||||
[node name="Spawn-TL" type="Node2D" parent="."]
|
||||
|
||||
transform/pos = Vector2( -54.2938, -152.909 )
|
||||
|
||||
[node name="Spawn-BR" type="Node2D" parent="."]
|
||||
|
||||
transform/pos = Vector2( 689.199, 142.937 )
|
||||
|
||||
|
||||
|
|
|
@ -56,4 +56,12 @@ shape = SubResource( 2 )
|
|||
trigger = false
|
||||
_update_shape_index = 0
|
||||
|
||||
[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."]
|
||||
|
||||
rect = Rect2( -10, -10, 20, 20 )
|
||||
|
||||
[connection signal="exit_screen" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_exit_screen"]
|
||||
|
||||
[connection signal="exit_viewport" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_exit_viewport"]
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
[gd_scene load_steps=2 format=1]
|
||||
|
||||
[ext_resource path="res://assets/poop.png" type="Texture" id=1]
|
||||
|
||||
[node name="Node2D" type="Node2D"]
|
||||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
|
||||
texture = ExtResource( 1 )
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
extends ToolButton
|
||||
|
||||
# class member variables go here, for example:
|
||||
# var a = 2
|
||||
# var b = "textvar"
|
||||
|
||||
func _ready():
|
||||
# Called every time the node is added to the scene.
|
||||
# Initialization here
|
||||
set_fixed_process(true)
|
||||
|
||||
func _fixed_process(delta):
|
||||
if(Input.is_action_pressed("ui_button_2")):
|
||||
emit_signal('pressed')
|
|
@ -11,8 +11,12 @@ var health = 50
|
|||
func _ready():
|
||||
# Called every time the node is added to the scene.
|
||||
# Initialization here
|
||||
randomize()
|
||||
get_node('HealthBar').set_max(max_health)
|
||||
get_node('HealthBar').set_value(max_health)
|
||||
if randf() <= 0.1:
|
||||
set_hp(rand_range(max_health * 0.5, max_health))
|
||||
else:
|
||||
set_hp(max_health)
|
||||
pass
|
||||
|
||||
func heal(amount):
|
||||
|
@ -22,19 +26,24 @@ func damage(amount):
|
|||
change_hp(-amount)
|
||||
|
||||
func change_hp(amount):
|
||||
var previous_health = health;
|
||||
health += amount
|
||||
if (health > max_health):
|
||||
health = max_health
|
||||
if (previous_health != health):
|
||||
var previous_health = health
|
||||
var next_health = previous_health + amount
|
||||
if (next_health > max_health):
|
||||
next_health = max_health
|
||||
if (previous_health != next_health):
|
||||
set_hp(next_health)
|
||||
emit_signal('hp_changed', self)
|
||||
if (health <= min_health):
|
||||
if (next_health <= min_health):
|
||||
emit_signal('hp_empty', self)
|
||||
queue_free()
|
||||
|
||||
func set_hp(h):
|
||||
health = h
|
||||
get_node('HealthBar').set_value(health)
|
||||
if (health < max_health):
|
||||
if (get_global_rot() != 0):
|
||||
get_node('HealthBar').set_rotation(-get_rot())
|
||||
get_node('HealthBar').set_pos(Vector2(-18,15))
|
||||
get_node('HealthBar').show()
|
||||
else:
|
||||
get_node('HealthBar').hide()
|
||||
|
|
|
@ -15,7 +15,13 @@ var cooldowns = {
|
|||
'default': 1,
|
||||
'current': 0,
|
||||
},
|
||||
'eat' : {
|
||||
'default': 0.5,
|
||||
'current': 0,
|
||||
}
|
||||
}
|
||||
var strength = 1
|
||||
var turd_count = 0
|
||||
var facing_collisions = Dictionary()
|
||||
|
||||
func _ready():
|
||||
|
@ -69,18 +75,37 @@ func _can_do_action(action):
|
|||
return true
|
||||
|
||||
func _do_action(action):
|
||||
print('Doing: ', action)
|
||||
#print('Doing: ', action)
|
||||
if action in cooldowns:
|
||||
cooldowns[action]['current'] = cooldowns[action]['default']
|
||||
if action == 'ram':
|
||||
_do_ram()
|
||||
elif action == 'eat':
|
||||
_do_eat()
|
||||
|
||||
func _do_ram():
|
||||
# Ram Distance?
|
||||
var bodies = get_node('ActionArea').get_overlapping_bodies()
|
||||
print(bodies)
|
||||
#print(bodies)
|
||||
for b in bodies:
|
||||
if b.has_method('damage'):
|
||||
b.damage(1)
|
||||
b.damage(strength)
|
||||
if get_node('/root/game').has_method('update_suspicion'):
|
||||
get_node('/root/game').update_suspicion(5)
|
||||
get_node('/root/game').update_suspicion(5)
|
||||
|
||||
func _do_eat():
|
||||
var areas = get_node('ActionArea').get_overlapping_areas()
|
||||
#print(areas)
|
||||
for a in areas:
|
||||
var n = a.get_parent()
|
||||
if n.has_method('is_eatable'):
|
||||
if n.is_eatable():
|
||||
n.eat(self)
|
||||
|
||||
|
||||
func _on_VisibilityNotifier2D_exit_screen():
|
||||
get_node('/root/game').game_over("You made it to sweet sweet freedom :)", false)
|
||||
|
||||
|
||||
func _on_VisibilityNotifier2D_exit_viewport( viewport ):
|
||||
get_node('/root/game').game_over("You made it to sweet sweet freedom :)", false)
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
extends KinematicBody2D
|
||||
|
||||
# class member variables go here, for example:
|
||||
# var a = 2
|
||||
# var b = "textvar"
|
||||
|
||||
const STATE_IDLE = "idle"
|
||||
const STATE_FLOCKING = "flock"
|
||||
const STATE_ROAM = "roam"
|
||||
|
||||
var destination = Vector2()
|
||||
var state = STATE_IDLE
|
||||
var blocked_move = Vector2(0, 0)
|
||||
var turd_count = 0
|
||||
var strength = 0
|
||||
|
||||
func _ready():
|
||||
# Called every time the node is added to the scene.
|
||||
# Initialization here
|
||||
set_process(true)
|
||||
|
||||
func _process(delta):
|
||||
for i in get_node("Area2D").get_overlapping_areas():
|
||||
var n = i.get_parent();
|
||||
if n.has_method('is_eatable'):
|
||||
n.eat(self)
|
||||
|
||||
if state == STATE_IDLE:
|
||||
if randf() < 0.05:
|
||||
var d = pick_random_destination()
|
||||
#print("I want wander to ", d)
|
||||
destination = d
|
||||
state = STATE_ROAM
|
||||
if state == STATE_ROAM:
|
||||
if destination.distance_to(get_global_pos()) < 50:
|
||||
#print("I have arrived")
|
||||
state = STATE_IDLE
|
||||
if state == STATE_ROAM or state == STATE_FLOCKING:
|
||||
var dir = (destination - get_global_pos()).normalized()
|
||||
var motion = dir * rand_range(20, 100) * delta
|
||||
var blocked = move(motion)
|
||||
if blocked - blocked_move != Vector2(0, 0):
|
||||
#print(blocked - blocked_move)
|
||||
if state == STATE_ROAM:
|
||||
state = STATE_IDLE
|
||||
#print("I think I might be stuck")
|
||||
blocked_move = blocked
|
||||
|
||||
if turd_count > 0:
|
||||
poop()
|
||||
|
||||
func flock(d, enable = true):
|
||||
if not enable:
|
||||
state = STATE_ROAM
|
||||
destination = pick_random_destination()
|
||||
return
|
||||
destination = d
|
||||
state = STATE_FLOCKING
|
||||
|
||||
func pick_random_destination():
|
||||
var v = get_viewport_rect()
|
||||
return Vector2(rand_range(v.pos.x, v.end.x), rand_range(v.pos.y, v.end.y))
|
||||
|
||||
func poop():
|
||||
turd_count -= 1
|
||||
var t = preload("res://poop.tscn")
|
||||
var n = t.instance()
|
||||
n.set_global_pos(get_global_pos())
|
||||
get_node('/root/game/Level').add_child(n)
|
30
sheep.tscn
|
@ -1,12 +1,18 @@
|
|||
[gd_scene load_steps=3 format=1]
|
||||
[gd_scene load_steps=5 format=1]
|
||||
|
||||
[ext_resource path="res://assets/sheep.png" type="Texture" id=1]
|
||||
[ext_resource path="res://sheep.gd" type="Script" id=1]
|
||||
[ext_resource path="res://assets/sheep.png" type="Texture" id=2]
|
||||
|
||||
[sub_resource type="CircleShape2D" id=1]
|
||||
|
||||
custom_solver_bias = 0.0
|
||||
radius = 25.0
|
||||
|
||||
[sub_resource type="CircleShape2D" id=2]
|
||||
|
||||
custom_solver_bias = 0.0
|
||||
radius = 15.0
|
||||
|
||||
[node name="KinematicBody2D" type="KinematicBody2D"]
|
||||
|
||||
input/pickable = false
|
||||
|
@ -16,6 +22,7 @@ shapes/0/trigger = false
|
|||
collision/layers = 1
|
||||
collision/mask = 1
|
||||
collision/margin = 0.08
|
||||
script/script = ExtResource( 1 )
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
|
||||
|
@ -25,6 +32,23 @@ _update_shape_index = 0
|
|||
|
||||
[node name="Sprite" type="Sprite" parent="."]
|
||||
|
||||
texture = ExtResource( 1 )
|
||||
texture = ExtResource( 2 )
|
||||
|
||||
[node name="Area2D" type="Area2D" parent="."]
|
||||
|
||||
input/pickable = true
|
||||
shapes/0/shape = SubResource( 2 )
|
||||
shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
|
||||
shapes/0/trigger = false
|
||||
gravity_vec = Vector2( 0, 1 )
|
||||
gravity = 98.0
|
||||
linear_damp = 0.1
|
||||
angular_damp = 1.0
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
|
||||
|
||||
shape = SubResource( 2 )
|
||||
trigger = false
|
||||
_update_shape_index = 0
|
||||
|
||||
|
||||
|
|