#!perl my %unit = ( silver => 1, gold => 10, platina => 50, royalty => 5000, ); my %aliases = ( platinum => 'platina', royalties => 'royalty' ); sub find_unpaid { my ($ob) = @_; my @unpaid; for ($ob->inv) { push @unpaid, $_ if $_->get_flag (cf::FLAG_UNPAID); if ($_->inv) { push @unpaid, find_unpaid ($_->inv); } } return @unpaid; } cf::register_script_function "reseller::list_sells" => sub { my ($who, $msg, $npc) = @_; my $sells = $npc->{sells}->{$who->name}; unless (keys %{$sells || {}}) { $who->reply ($npc, "I'm sorry, but you sold nothing.\n"); return 0; } $who->message ($npc->name . " says: You sold:\n", cf::NDI_BROWN); for (keys %$sells) { my $n = $_; $n =~ s/\s*\(unpaid\)//g; $who->message ("$n for " . cf::cost_string_from_value ($sells->{$_}), cf::NDI_BROWN); } 0 }; sub on_trigger { my ($ev, $ob, $who_caused, $who) = @_; my $opt = $ev->options; warn "OPT $opt\n"; return 1 unless $opt =~ m/(\S+),(\d+),(\d+)/; my @obs = grep { $_->name eq $1 } $who->map->at ($2, $3); unless (@obs) { warn "Couldn't find shop keeper in " . $who->map . "\n"; return 1; } warn "FOOOOGEOG ".$obs[0]->name." <<\n"; for my $item (find_unpaid ($who)) { my $value = $item->query_cost ($who, cf::F_BUY | cf::F_SHOP); warn "Object " . $item->name . " bought by " . $who->name . " on map " . $who->map->path . " for $value silver has no seller set\n" unless $item->{seller}; $obs[0]->{sells}->{$item->{seller} || ''}->{$item->name} += $value; 1 and warn "Object " . $item->name . " bought by " . $who->name . " on map " . $who->map->path . " for $value silver sold by " . $item->{seller} . "\n"; } use Data::Dumper; warn "DO[" .Data::Dumper::Dumper ([$obs[0]]) . "]\n"; return 0; } sub on_drop_on { my ($ev, $on, $who, $what) = @_; my $name = $what->custom_name; if ($what->get_flag (cf::FLAG_UNPAID)) { return 0; } if (!$what->get_flag (cf::FLAG_IDENTIFIED)) { $who->message ("The shopkeeper says: Sorry, i don't accept unidentified stuff."); $what->insert_ob_in_ob ($who); return 1; } unless ($name =~ m/\d+\s*\S+/) { $who->message ("The shopkeeper says: Sorry, i don't recognize '$name' as currency. Please name your item like '10 royalty' or '10 platinum 2 silver'", cf::NDI_BROWN); $what->insert_ob_in_ob ($who); return 1; } my $value = 0; while ($name =~ s/^\s*(\d+)\s*(\S+)//) { if ($aliases{lc $2} or $unit{lc $2}) { $value += $1 * ($unit{lc $2} ? $unit{lc $2} : $unit{$aliases{lc $2}}); } else { $what->insert_ob_in_ob ($who); $who->message ("The shopkeeper says: I don't know the currency '$2'", cf::NDI_BROWN); return 1; } } my $nrof = $what->nrof; $what->set_nrof (1); $what->set_value ($value); my $cost = $what->query_cost ($who, cf::F_BUY | cf::F_SHOP); if ($cost) { my $fact = $value / $cost; $what->set_value (cf::ceil ($value * $fact)); } $what->set_nrof ($nrof); $who->message ("The shopkeeper says: Ok, I marked " . $what->nrof . " " . $what->name . " to sell for " . cf::cost_string_from_value ($value) . " a piece", cf::NDI_BROWN); $what->set_flag (cf::FLAG_UNPAID, 1); $what->{seller} = $who->name; $what->set_custom_name (undef); $what->insert_ob_in_map_at ($who->map, $who, cf::INS_BELOW_ORIGINATOR, $who->x, $who->y); 1; }