godot-genre-idle-clicker

安装量: 44
排名: #16836

安装

npx skills add https://github.com/thedivergentai/gd-agentic-skills --skill godot-genre-idle-clicker
Genre: Idle / Clicker
Expert blueprint for idle/clicker games with exponential progression and prestige mechanics.
NEVER Do
NEVER use standard float for currency
— Floats overflow at ~1.8e308. Implement BigNumber (mantissa + exponent) from day 1.
NEVER use Timer nodes for revenue
— Timers drift and pause when game pauses. Use
_process(delta)
accumulator for precise timing.
NEVER make prestige feel like punishment
— Post-prestige runs should be 2-5x faster. Otherwise players feel like they lost progress.
NEVER update all UI labels every frame
— Updating 50+ labels at 60fps causes lag. Use signals to update only when values change, or throttle to 10fps.
NEVER forget offline progress
— Calculate
seconds_offline * revenue_per_second
on game start. Missing this destroys retention.
Available Scripts
MANDATORY
Read the appropriate script before implementing the corresponding pattern.
scientific_notation_formatter.gd
Big number formatter handling 1e303+. Uses K/M/B/T suffixes up to Vigintillion, falls back to scientific notation. Caching advice for high-label-count scenarios.
Core Loop
Click
Player performs manual action to gain currency.
Buy
Player purchases "generators" (auto-clickers).
Wait
Game plays itself, numbers go up.
Upgrade
Player buys multipliers to increase efficiency.
Prestige
Player resets progress for a permanent global multiplier. Skill Chain Phase Skills Purpose 1. Math godot-gdscript-mastery Handling numbers larger than 64-bit float 2. UI godot-ui-containers , labels Displaying "1.5e12" or "1.5T" cleanly 3. Data godot-save-load-systems Saving progress, offline time calculation 4. Logic signals Decoupling UI from the economic simulation 5. Meta json-serialization Balancing hundreds of upgrades via data Architecture Overview 1. Big Number System Standard float goes to INF around 1.8e308. Idle games often go beyond. You need a custom BigNumber class (Mantissa + Exponent).

big_number.gd

class_name BigNumber var mantissa : float = 0.0

1.0 to 10.0

var exponent : int = 0

Power of 10

func _init ( m : float , e : int ) -> void : mantissa = m exponent = e normalize ( ) func normalize ( ) -> void : if mantissa

= 10.0 : mantissa /= 10.0 exponent += 1 elif mantissa < 1.0 and mantissa != 0.0 : mantissa *= 10.0 exponent -= 1 2. Generator System The core entities that produce currency.

generator.gd

class_name Generator extends Resource @ export var id : String @ export var base_cost : BigNumber @ export var base_revenue : BigNumber @ export var cost_growth_factor : float = 1.15 var count : int = 0 func get_cost ( ) -> BigNumber :

Cost = Base * (Growth ^ Count)

return base_cost . multiply ( pow ( cost_growth_factor , count ) ) 3. Simulation Manager (Offline Progress) Calculating gains while the game was closed.

game_manager.gd

func _ready ( ) -> void : var last_save_time = save_data . timestamp var current_time = Time . get_unix_time_from_system ( ) var seconds_offline = current_time - last_save_time if seconds_offline

60 : var revenue = calculate_revenue_per_second ( ) . multiply ( seconds_offline ) add_currency ( revenue ) show_welcome_back_popup ( revenue ) Key Mechanics Implementation Prestige System (Reset) Resetting generators but keeping prestige_currency . func prestige ( ) -> void : if current_money . less_than ( prestige_threshold ) : return

Formula: Cube root of money / 1 million

(Just an example, depends on balance)

var gained_keys = calculate_prestige_gain ( ) save_data . prestige_currency += gained_keys save_data . global_multiplier = 1.0 + ( save_data . prestige_currency * 0.10 )

Reset

save_data
.
money
=
BigNumber
.
new
(
0
,
0
)
save_data
.
generators
=
ResetGenerators
(
)
save_game
(
)
reload_scene
(
)
Formatting Numbers
Displaying
1234567
as
1.23M
.
static
func
format
(
bn
:
BigNumber
)
->
String
:
if
bn
.
exponent
<
3
:
return
str
(
int
(
bn
.
mantissa
*
pow
(
10
,
bn
.
exponent
)
)
)
var
suffixes
=
[
""
,
"K"
,
"M"
,
"B"
,
"T"
,
"Qa"
,
"Qi"
]
var
suffix_idx
=
bn
.
exponent
/
3
if
suffix_idx
<
suffixes
.
size
(
)
:
return
"%.2f%s"
%
[
bn
.
mantissa
*
pow
(
10
,
bn
.
exponent
%
3
)
,
suffixes
[
suffix_idx
]
]
else
:
return
"%.2fe%d"
%
[
bn
.
mantissa
,
bn
.
exponent
]
Godot-Specific Tips
Timers
Do NOT use
Timer
nodes for revenue generation (drifting). Use
_process(delta)
and accumulate time.
GridContainer
Perfect for the "Generators" list.
Resources
Use
.tres
files to define every generator (Farm, Mine, Factory) so you can tweak balance without touching code.
Common Pitfalls
Floating Point Errors
Using standard
float
for money.
Fix
Use BigNumber implementation immediately.
Boring Prestige
Resetting feels like a punishment.
Fix
Ensure the post-prestige run is
significantly
faster (2x-5x speed).
UI Lag
Updating 50 text labels every frame.
Fix
Only update labels when values actually change (Signal-based), or throttling updates to 10fps. Reference Master Skill: godot-master
返回排行榜