Games-Axmud
view release on metacpan or search on metacpan
lib/Games/Axmud/Obj/Map.pm view on Meta::CPAN
if ($oldRoomObj) {
if (
($oldRoomObj->parent != $self->mapWin->currentRegionmap->number)
|| ($oldRoomObj->zPosBlocks != $self->mapWin->currentRegionmap->currentLevel)
) {
$oldRoomObj = undef; # Don't redraw it
}
}
if ($newRoomObj) {
if (
($newRoomObj->parent != $self->mapWin->currentRegionmap->number)
|| ($newRoomObj->zPosBlocks != $self->mapWin->currentRegionmap->currentLevel)
) {
$newRoomObj = undef; # Don't redraw it
}
}
# Final check that neither room has been deleted in the last few microseconds (we think
# this code can make a deleted room re-appear on the map, but we're not sure)
if ($oldRoomObj && ! $self->worldModelObj->ivExists('modelHash', $oldRoomObj->number)) {
$oldRoomObj = undef;
}
if ($newRoomObj && ! $self->worldModelObj->ivExists('modelHash', $newRoomObj->number)) {
$newRoomObj = undef;
}
if ($oldRoomObj) {
push (@drawList, 'room', $oldRoomObj);
}
if ($newRoomObj) {
push (@drawList, 'room', $newRoomObj);
}
if (
$otherRoomObj
&& (! $oldRoomObj || $oldRoomObj ne $otherRoomObj)
&& (! $newRoomObj || $newRoomObj ne $otherRoomObj)
) {
push (@drawList, 'room', $otherRoomObj);
}
if (@drawList) {
$self->mapWin->markObjs(@drawList);
$self->mapWin->doDraw();
}
}
return 1;
}
sub updateLocator {
# Can be called by anything, including many GA::Win::Map functions
# Updates the Locator task (if it is running) with this object's current location
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments
# 1 otherwise
my ($self, $check) = @_;
# Local variables
my $taskObj;
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->updateLocator', @_);
}
$taskObj = $self->session->locatorTask;
if ($taskObj) {
# Tell the Locator which world model room is current
if ($self->currentRoom) {
$taskObj->set_modelNumber($self->currentRoom->number);
# Copy the room tag into the Locator's non-model room, if there is a room tag (and
# if the Locator has a non-model room)
if ($taskObj->roomObj) {
if ($self->currentRoom->roomTag) {
$taskObj->roomObj->ivPoke('roomTag', $self->currentRoom->roomTag);
} else {
# The non-model room's room tag must be reset
$taskObj->roomObj->ivUndef('roomTag');
}
}
} else {
$taskObj->set_modelNumber();
if ($taskObj->roomObj) {
# The room tag of the non-model room must be reset
$taskObj->roomObj->ivUndef('roomTag');
}
}
# Refresh the Locator task's window to display the changes
$taskObj->refreshWin();
}
return 1;
lib/Games/Axmud/Obj/Map.pm view on Meta::CPAN
if ($self->worldModelObj->explainGetLostFlag) {
$self->session->writeText(
'MAP: Lost because the character used a random exit, but no matching rooms'
. ' were found',
);
}
return $self->setCurrentRoom(
undef,
$self->_objClass . '->reactRandomExit', # Character now lost
TRUE, # Use auto-rescue mode, if possible
);
} elsif (@foundList == 1) {
# This is the new current room
return $self->setCurrentRoom($foundList[0]);
} else {
# There is more than one matching room. Select all the matching rooms, so the user
# can decide which to use (if the Automapper window is open)
if ($self->mapWin) {
# First unselect any currently selected objects
$self->mapWin->setSelectedObj();
# Select all of the matching rooms. $self->setSelectedObj expects a list in the
# form:
# (room_object, 'room', room_object, 'room', ...)
foreach my $roomObj (@foundList) {
push (@selectList, $roomObj, 'room');
}
$self->mapWin->setSelectedObj(
\@selectList,
TRUE, # Select multiple objects
);
}
if ($self->worldModelObj->explainGetLostFlag) {
$self->session->writeText(
'MAP: Lost because the character used a random exit, and there is more than'
. ' one possible new location',
);
}
return $self->setCurrentRoom(
undef,
$self->_objClass . '->reactRandomExit', # Character now lost
TRUE, # Use auto-rescue mode, if possible
);
}
}
}
sub updateRoom {
# Called by $self->moveKnownDirSeen, $self->lookGlanceSeen and $self->createNewRoom in order
# to update the properties of a room object in the world model to match those of the
# Locator task's non-model current room
# If the Automapper window is open and is in 'update' mode, GA::Obj::WorldModel is called
# to do the bulk of the updating
#
# Expected arguments
# $modelRoomObj
# - A GA::ModelObj::Room in the world model
#
# Optional arguments
# $connectRoomObj, $connectExitObj, $mapDir
# - When called by $self->createNewRoom, the room from which we arrived and the exit/
# standard direction used to depart from it (if known). Used when temporarily
# allocating primary directions to unallocated exits
#
# Return values
# 'undef' on improper arguments
# 1 otherwise
my ($self, $modelRoomObj, $connectRoomObj, $connectExitObj, $mapDir, $check) = @_;
# Check for improper arguments
if (! defined $modelRoomObj || defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->updateRoom', @_);
}
# If the Automapper window is open (and in 'follow' or 'update' mode), or if the Automapper
# window is closed but we're tracking the character's location, update the region's count
# of living and non-living things in the current room
if (
($self->mapWin && ($self->mapWin->mode eq 'follow' || $self->mapWin->mode eq 'update'))
|| (! $self->mapWin && $self->trackAloneFlag)
) {
$self->worldModelObj->countRoomContents($self->session, $modelRoomObj);
}
# If the Automapper window is open (and in 'update' room), we can update the room's
# properties
if ($self->mapWin && $self->mapWin->mode eq 'update') {
$self->worldModelObj->updateRoom(
$self->session,
TRUE, # Update Automapper windows now
$modelRoomObj,
$connectRoomObj,
$connectExitObj,
$mapDir,
);
}
# Update complete
return 1;
}
sub autoCompareLocatorRoom {
# Called by $self->createNewRoom and ->setCurrentRoom
( run in 0.813 second using v1.01-cache-2.11-cpan-39bf76dae61 )