slave-princess-charlotte/data/Plugin/face.js
2025-10-19 23:50:23 -05:00

418 lines
No EOL
13 KiB
JavaScript

var actorMap = {};
var actorGameMap = {};
var actor1Map = {};
var actor2Map = {};
var actorEroMap = {};
var actorEro2Map = {};
var actorEro3Map = {};
var clearActorIndex = 0;
function clearActorMap() {
actorMap = {};
actorGameMap = {};
actor1Map = {};
actor2Map = {};
actorEroMap = {};
actorEro2Map = {};
actorEro3Map = {};
setNaked(false);
root.log('clearActorMap' + clearActorIndex++);
}
ContentRenderer.drawUnitFace = function(x, y, unit, isReverse, alpha, isBig) {
var handle = unit.getFaceResourceHandle();
var pic = GraphicsRenderer.getGraphics(handle, GraphicsType.FACE);
if (pic === null) {
return;
}
if (isBig) {
var u;
var val = getNameByVal2(unit.getName());
var switchId = getEroEquipSwitchId(val, -2);
var isOn = root.getMetaSession().getGlobalSwitchTable().isSwitchOn(switchId);
if (isEro() || isOn) {
var session = root.getCurrentSession();
if (root.getCurrentScene() === SceneType.FREE && session != null) {
var mapType = session.getCurrentMapInfo().getMapType();
if (mapType === MapType.NORMAL) {
u = getActorEro3(unit);
} else {
u = getActorEro2(unit);
}
}
else {
u = getActorEro2(unit);
}
} else {
u = getActor2(unit);
}
if (u) {
handle = u.getFaceResourceHandle();
pic = GraphicsRenderer.getGraphics(handle, GraphicsType.FACE);
} else {
x += 20;
y += 12;
}
}
pic.setReverse(isReverse);
pic.setAlpha(alpha);
this._drawShrinkFace(x, y, handle, pic);
};
function getActor1(unit) {
if (! unit) {
return null
}
if (actor1Map[unit.getId()] !== undefined) {
if (actor1Map[unit.getId()] == null) {
return null;
} else {
return actor1Map[unit.getId()];
}
} else {
var list = root.getBaseData().getPlayerList();
var name = unit.getName();
// Strip suffix after underscore
if (name.indexOf('_') > 1) {
name = name.substr(0, name.indexOf('_'));
}
// Strip trailing numbers
if (name.length > 1 && name.match(/[0-9]$/)) {
name = name.substr(0, name.length - 1);
}
// Map full English names to abbreviated forms
switch(name) {
case 'Charlotte': name = 'Char'; break;
case 'Corne': name = 'Corn'; break;
case 'Lena': name = 'Lena'; break;
case 'Luriel': name = 'Luri'; break;
case 'Kaede': name = 'Kaed'; break;
case 'Karla': name = 'Karl'; break;
case 'Chris': name = 'Chri'; break;
case 'Sherry': name = 'Sher'; break;
case 'Mel': name = 'Mel'; break;
case 'Tina': name = 'Tina'; break;
case 'Lou': name = 'Lou'; break;
case 'Saria': name = 'Sari'; break;
case 'Tabatha': name = 'Taba'; break;
case 'Dalles': name = 'Dall'; break;
case 'Giacomo': name = 'Giac'; break;
}
// For Japanese names, truncate to 4 chars
if (name.length > 4) {
name = name.substr(0, 4);
}
for (var i = 0; i < list.getCount(); i++) {
var u = list.getData(i);
if ((name + '1') == u.getName()) {
actor1Map[unit.getId()] = u;
return u;
}
}
actor1Map[unit.getId()] = null;
return null;
}
}
function getActorByName2(name) {
if (actorMap[name] !== undefined) {
if (actorMap[name] == null) {
return null;
} else {
return actorMap[name];
}
} else {
var list = root.getBaseData().getPlayerList();
for (var i = 0; i < list.getCount(); i++) {
var u = list.getData(i);
if (u.getName() == name) {
actorMap[name] = u;
return u;
}
}
actorMap[name] = null;
return null;
}
}
function getActorByName3(name) {
if (actorGameMap[name] !== undefined) {
if (actorGameMap[name] == null) {
return null;
} else {
return actorGameMap[name];
}
} else {
var list = root.getCurrentSession().getPlayerList();
for (var i = 0; i < list.getCount(); i++) {
var u = list.getData(i);
if (u.getName() == name) {
actorGameMap[name] = u;
return u;
}
}
actorGameMap[name] = null;
return null;
}
}
function getActor2(unit) {
if (actor2Map[unit.getId()] !== undefined) {
if (actor2Map[unit.getId()] == null) {
return null;
} else {
return actor2Map[unit.getId()];
}
} else {
var list = root.getBaseData().getPlayerList();
var name = unit.getName();
// Strip suffix after underscore
if (name.indexOf('_') > 1) {
name = name.substr(0, name.indexOf('_'));
}
// Strip trailing numbers
if (name.length > 1 && name.match(/[0-9]$/)) {
name = name.substr(0, name.length - 1);
}
// Map full English names to abbreviated forms
switch(name) {
case 'Charlotte': name = 'Char'; break;
case 'Corne': name = 'Corn'; break;
case 'Lena': name = 'Lena'; break;
case 'Luriel': name = 'Luri'; break;
case 'Kaede': name = 'Kaed'; break;
case 'Karla': name = 'Karl'; break;
case 'Chris': name = 'Chri'; break;
case 'Sherry': name = 'Sher'; break;
case 'Mel': name = 'Mel'; break;
case 'Tina': name = 'Tina'; break;
case 'Lou': name = 'Lou'; break;
case 'Saria': name = 'Sari'; break;
case 'Tabatha': name = 'Taba'; break;
case 'Dalles': name = 'Dall'; break;
case 'Giacomo': name = 'Giac'; break;
}
// For Japanese names, truncate to 4 chars
if (name.length > 4) {
name = name.substr(0, 4);
}
for (var i = 0; i < list.getCount(); i++) {
var u = list.getData(i);
if ((name + '2') == u.getName()) {
actor2Map[unit.getId()] = u;
return u;
}
}
actor2Map[unit.getId()] = null;
return null;
}
}
function getActorEro(unit) {
if (! unit) {
return null;
}
if (actorEroMap[unit.getId()] !== undefined) {
if (actorEroMap[unit.getId()] == null) {
return null;
} else {
return actorEroMap[unit.getId()];
}
} else {
var name = getSearchName(unit);
var list = root.getBaseData().getPlayerList();
for (var i = 0; i < list.getCount(); i++) {
var u = list.getData(i);
if ((name + '_ero') == u.getName()) {
actorEroMap[unit.getId()] = u;
return u;
}
}
actorEroMap[unit.getId()] = null;
return null;
}
}
function getActorEro2(unit) {
if (actorEro2Map[unit.getId()] !== undefined) {
if (actorEro2Map[unit.getId()] == null) {
return null;
} else {
return actorEro2Map[unit.getId()];
}
} else {
var name = getSearchName(unit);
var list = root.getBaseData().getPlayerList();
for (var i = 0; i < list.getCount(); i++) {
var u = list.getData(i);
if ((name + '_ero2') == u.getName()) {
actorEro2Map[unit.getId()] = u;
return u;
}
}
actorEro2Map[unit.getId()] = null;
return null;
}
}
function getActorEro3(unit) {
if (actorEro3Map[unit.getId()] !== undefined) {
if (actorEro3Map[unit.getId()] == null) {
return null;
} else {
return actorEro3Map[unit.getId()];
}
} else {
var name = getSearchName(unit);
var list = root.getBaseData().getPlayerList();
for (var i = 0; i < list.getCount(); i++) {
var u = list.getData(i);
if ((name + '_ero3') == u.getName()) {
actorEro3Map[unit.getId()] = u;
return u;
}
}
actorEro3Map[unit.getId()] = null;
return null;
}
}
function getSearchName(unit) {
var name = unit.getName();
if (name.indexOf('_') > 1) {
name = name.substr(0, name.indexOf('_'));
}
// Handle numbered variants (e.g., remove trailing numbers)
if (name.length > 1 && name.match(/[0-9]$/)) {
name = name.substr(0, name.length - 1);
}
// Map full English names to abbreviated forms
switch(name) {
case 'Charlotte': return 'Char';
case 'Corne': return 'Corn';
case 'Lena': return 'Lena';
case 'Luriel': return 'Luri';
case 'Kaede': return 'Kaed';
case 'Karla': return 'Karl';
case 'Chris': return 'Chri';
case 'Sherry': return 'Sher';
case 'Mel': return 'Mel';
case 'Tina': return 'Tina';
case 'Lou': return 'Lou';
case 'Saria': return 'Sari';
case 'Tabatha': return 'Taba';
case 'Dalles': return 'Dall';
case 'Giacomo': return 'Giac';
case 'Angela': return 'Ange';
case 'Carlos': return 'Carl';
case 'Majid': return 'Maji';
}
// For Japanese names and already-abbreviated names, truncate to 4 chars
if (name.length > 4) {
name = name.substr(0, 4);
}
return name;
}
ContentRenderer._drawShrinkFace = function(xDest, yDest, handle, pic) {
var xSrc, ySrc;
var destWidth = GraphicsFormat.FACE_WIDTH;
var destHeight = GraphicsFormat.FACE_HEIGHT;
var srcWidth = destWidth;
var srcHeight = destHeight;
xSrc = handle.getSrcX() * srcWidth;
if (root.isLargeFaceUse() && pic.isLargeImage()) {
srcWidth = root.getLargeFaceWidth();
srcHeight = root.getLargeFaceHeight();
destWidth = root.getLargeFaceWidth();
destHeight = root.getLargeFaceHeight();
xSrc = handle.getSrcX() * srcWidth;
}
ySrc = handle.getSrcY() * srcHeight;
pic.drawStretchParts(xDest, yDest, destWidth, destHeight, xSrc, ySrc, srcWidth, srcHeight);
};
BaseMessageView.drawFace = function(xDest, yDest) {
var pic, xSrc, ySrc;
var destWidth = GraphicsFormat.FACE_WIDTH;
var destHeight = GraphicsFormat.FACE_HEIGHT;
var srcWidth = destWidth;
var srcHeight = destHeight;
var handle = this._faceHandle;
var facialExpressionId = this._faceId;
if (handle === null) {
return;
}
pic = GraphicsRenderer.getGraphics(handle, GraphicsType.FACE);
if (pic === null) {
return;
}
/*if (root.isLargeFaceUse() && false) {
destWidth = root.getLargeFaceWidth();
destHeight = root.getLargeFaceHeight();
if (pic.isLargeImage()) {
srcWidth = destWidth;
srcHeight = destHeight;
}
}*/
if (facialExpressionId === 0) {
xSrc = handle.getSrcX();
ySrc = handle.getSrcY();
}
else {
xSrc = Math.floor(facialExpressionId % 6);
ySrc = Math.floor(facialExpressionId / 6);
}
if (this._messageLayout.isFaceReverse()) {
pic.setReverse(true);
}
xSrc *= srcWidth;
ySrc *= srcHeight;
pic.drawStretchParts(xDest, yDest, destWidth, destHeight, xSrc, ySrc, srcWidth, srcHeight);
};
BaseMessageView._setupName = function(messageViewParam) {
var name = '';
if (messageViewParam.unit !== null) {
name = messageViewParam.unit.getName();
}
else if (messageViewParam.npc !== null) {
name = messageViewParam.npc.getName();
}
if (name == '_') {
name = '';
}
if (name.indexOf('_') > 1) {
name = name.substr(0, name.indexOf('_'));
}
if (name == 'Char') {
name = 'Charlotte';
}
if (name == 'シャルロ') {
name = 'シャルロット';
}
this._name = name;
};