--- cf.schmorp.de/maps/perl/nimbus.ext 2006/03/17 02:40:09 1.1 +++ cf.schmorp.de/maps/perl/nimbus.ext 2006/03/28 16:08:19 1.8 @@ -18,40 +18,46 @@ $save } -sub stats_fix($) { - my ($stats) = @_; - - $stats->hp = $stats->maxhp; - $stats->grace = $stats->maxgrace; - $stats->food = 999; -} - sub stats_set($$) { my ($stats, $save) = @_; for my $stat (@STATS) { $stats->$stat ($save->{$stat}); } + + $stats->hp ($stats->maxhp); + $stats->grace ($stats->maxgrace); + $stats->food (999); } sub skills_get($) { my ($ob) = @_; - [map [$_->skill, $_->exp], - grep $_->type == cf::SKILL, - $ob->inv] + +{ + map +($_->skill => $_->stats->exp), + grep $_->type == cf::SKILL, + $ob->inv + } } -sub skills_set($) { - die; +sub skills_set($$) { + my ($ob, $skills) = @_; + + for my $skill (grep $_->type == cf::SKILL, $ob->inv) { + my $name = $skill->skill; + + if ($skill->stats->exp < $skills->{$name}) { + $skill->stats->exp ($skills->{$name}); + $ob->player_lvl_adj ($skill); + } + } } # called when the player will likely die (modulo explore mode) # but before any stats/exp is changed sub on_player_death { - my ($event) = @_; + my ($ob) = @_; - my $ob = $event->{who}; my $pl = $ob->contr; # save player stats and experience to restore it later @@ -63,7 +69,7 @@ skill_exp => skills_get $ob, }; - $ob->{nimbus_save} = $save; + $ob->{in_nimbus} ||= $save; my $path = sprintf "%s/%s/%s/%s", cf::localdir, cf::playerdir, $ob->name, "nimbus"; @@ -73,6 +79,31 @@ $nimbus->set_unique (1); $pl->set_savebed ($path, 24, 12); + + $ob->message ("\n"); + $ob->message ("You start to feel dizzy.\n"); + $ob->message ("The world around you blurs.\n"); + $ob->message ("\n"); + + 0 +} + +sub teleport { + my ($pl, $map, $x, $y) = @_; + + return if $pl->ob->map->path eq $map + && abs ($pl->ob->x - $x) <= 1 + && abs ($pl->ob->y - $y) <= 1; + + my $portal = cf::object::new "exit"; + + $portal->set_slaying ($map); + $portal->set_hp ($x); + $portal->set_sp ($y); + + $portal->apply ($pl->ob); + + $portal->free; } sub on_trigger { @@ -82,24 +113,39 @@ my $pl = $ob->contr; my @savebed; - warn "trigger $options $ob->{nimbus_save}\n";#d# - warn $ob->name; - - if (my $save = delete $ob->{nimbus_save}) { + if (my $save = delete $ob->{in_nimbus}) { @savebed = @{$save->{savebed}}; - use Data::Dumper; - print STDERR Dumper $save; + if ($options eq "restore") { + $ob->message ("The gods acknowledge your success.\n"); + stats_set $ob->stats, $save->{stats}; + stats_set $pl->orig_stats, $save->{orig_stats}; + $ob->player_lvl_adj; # update overall level + skills_set $ob, $save->{skill_exp}; + } else { + $ob->message ("The gods are disappointed with you.\n"); + } + } else { @savebed = ("/scorn/taverns/inn", 10, 5); } $pl->set_savebed (@savebed); - # TODO: you wake up... - $ob->teleport (cf::map::get_map $savebed[0], $savebed[1], $savebed[2]); + my $map = $ob->map; + + teleport $pl, @savebed; + + # should make this a temporary map and let cf deal with it + unlink $map->path; + unlink $map->path . ".cfperl"; + $map->delete_map; + + $pl->play_sound_player_only (cf::SOUND_PLAYER_DIES); - # TODO: invalidate map + $ob->message ("You feel as if you woke up from a dream.\n"); + $ob->message ("You have a headache.\n"); + $ob->message ("Maybe you should have a drink.\n"); 1 }