Seriously altered how Rooms, PremadeObjects, GameObjects, and Animations are created.
Now it uses an options object instead of optional function parameters.
This commit is contained in:
parent
9886b403e5
commit
9622041129
|
@ -379,9 +379,9 @@ Oversimplified.Rooms = {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a Room to the collection of Rooms
|
// Add a Room to the collection of Rooms
|
||||||
Oversimplified.Rooms.Add = function (name, width, height, backgroundSrc, stepSpeed, extraParameters) {
|
Oversimplified.Rooms.Add = function (name, options) {
|
||||||
if (typeof Oversimplified.Rooms[name] === 'undefined') {
|
if (typeof Oversimplified.Rooms[name] === 'undefined') {
|
||||||
Oversimplified.Rooms[name] = new Oversimplified.Room(name, width, height, backgroundSrc, stepSpeed, extraParameters);
|
Oversimplified.Rooms[name] = new Oversimplified.Room(name, options);
|
||||||
|
|
||||||
return Oversimplified.Rooms[name];
|
return Oversimplified.Rooms[name];
|
||||||
} else {
|
} else {
|
||||||
|
@ -402,36 +402,35 @@ Oversimplified.O = null;
|
||||||
/* Room Class
|
/* Room Class
|
||||||
|
|
||||||
name (required) : The unique identifier of the room. Used to locate the room within the Rooms namespace.
|
name (required) : The unique identifier of the room. Used to locate the room within the Rooms namespace.
|
||||||
width (optional) : The width of the room. The camera will not travel beyond this to the right. If it is larger than the camera's width and there is an object being followed by the camera, the camera can scroll to the farther portions of the room. If it is smaller than the camera's width, it will be set to the camera's width. -- default = Oversimplified.camera.width
|
options (optional) : An object with extra parameters for the Room. Options include:
|
||||||
height (optional) : The height of the room. The camera will not travel beyond this to the bottom. If it is larger than the camera's height and there is an object being followed by the camera, the camera can scroll to the farther portions of the room. If it is smaller than the camera's height, it will be set to the camera's height. -- default = Oversimplified.camera.height
|
width : The width of the room. The camera will not travel beyond this to the right. If it is larger than the camera's width and there is an object being followed by the camera, the camera can scroll to the farther portions of the room. If it is smaller than the camera's width, it will be set to the camera's width. -- default = Oversimplified.camera.width
|
||||||
backgroundSrc (optional) : The image that will be displayed as the room's background. If excluded or set to empty string (""), no background will show.
|
height : The height of the room. The camera will not travel beyond this to the bottom. If it is larger than the camera's height and there is an object being followed by the camera, the camera can scroll to the farther portions of the room. If it is smaller than the camera's height, it will be set to the camera's height. -- default = Oversimplified.camera.height
|
||||||
stepSpeed (optional) : The step speed for the Room. If excluded or set to 0, the default is used. -- default = Oversimplified.Settings.defaultStep
|
backgroundSrc : The image that will be displayed as the room's background. If excluded or set to empty string (""), no background will show.
|
||||||
extraParameters (optional) : An array of extra parameters for the Room. Options include:
|
stepSpeed : The step speed for the Room. If excluded or set to 0, the default is used. -- default = Oversimplified.Settings.defaultStep
|
||||||
|
backgroundSize : Sets the room size to whatever the backgroundSrc image size is, regardless of what is entered as width and height!
|
||||||
"background size" = sets the room size to whatever the backgroundSrc image size is, regardless of what is entered as width and height!
|
backgroundColor : Any hex color value. Sets the far background color (behind the background image, visible only if transparent or excluded). A JavaScript alternative to setting the HTML5 canvas's background color CSS.
|
||||||
|
foreground : Path to any image file, though .png or .gif file with transparency is ideal. Sets the foreground image that displays over the background and all objects in the room. Appears below the Room's DrawAbove() function but above any GameObject's DrawAbove() function.
|
||||||
"#FF0000" (any hex color value) = sets the far background color (behind the background image, visible only if transparent or excluded). A JavaScript alternative to setting the HTML5 canvas's background color CSS.
|
|
||||||
|
|
||||||
"foreground.png" (path to any .png or .gif file) = sets the foreground image that displays over the background and all objects in the room. Appears below the Room's DrawAbove() function but above any GameObject's DrawAbove() function.
|
|
||||||
*/
|
*/
|
||||||
Oversimplified.Room = function (name, width, height, backgroundSrc, stepSpeed, extraParameters) {
|
Oversimplified.Room = function (name, options) {
|
||||||
this.id = Oversimplified.nextID++;
|
this.id = Oversimplified.nextID++;
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
stepSpeed = (typeof stepSpeed !== 'undefined' && stepSpeed > 0) ? stepSpeed : Oversimplified.Settings.defaultStep;
|
|
||||||
extraParameters = typeof extraParameters !== 'undefined' ? extraParameters : [];
|
|
||||||
width = (typeof width !== 'undefined' && width >= Oversimplified.camera.width) ? width : Oversimplified.camera.width;
|
|
||||||
height = (typeof height !== 'undefined' && height >= Oversimplified.camera.height) ? height : Oversimplified.camera.height;
|
|
||||||
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
|
|
||||||
if (typeof backgroundSrc !== 'undefined' && backgroundSrc != "") {
|
options = typeof options !== 'undefined' ? options : {};
|
||||||
|
|
||||||
|
options.width = (typeof options.width !== 'undefined' && options.width >= Oversimplified.camera.width) ? options.width : Oversimplified.camera.width;
|
||||||
|
options.height = (typeof options.height !== 'undefined' && options.height >= Oversimplified.camera.height) ? options.height : Oversimplified.camera.height;
|
||||||
|
options.stepSpeed = (typeof options.stepSpeed !== 'undefined' && options.stepSpeed > 0) ? options.stepSpeed : Oversimplified.Settings.defaultStep;
|
||||||
|
|
||||||
|
this.width = options.width;
|
||||||
|
this.height = options.height;
|
||||||
|
|
||||||
|
if (typeof options.backgroundSrc !== 'undefined' && options.backgroundSrc != "") {
|
||||||
this.background = new Image();
|
this.background = new Image();
|
||||||
this.background.src = backgroundSrc;
|
this.background.src = options.backgroundSrc;
|
||||||
} else {
|
} else {
|
||||||
// If backgroundSrc is excluded or an empty string, instead use Oversimplified.emptyImage instead.
|
// If options.backgroundSrc is excluded or an empty string, instead use Oversimplified.emptyImage instead.
|
||||||
this.background = Oversimplified.emptyImage;
|
this.background = Oversimplified.emptyImage;
|
||||||
}
|
}
|
||||||
this.background.loaded = false;
|
this.background.loaded = false;
|
||||||
|
@ -439,8 +438,8 @@ Oversimplified.Room = function (name, width, height, backgroundSrc, stepSpeed, e
|
||||||
if (this.background != Oversimplified.emptyImage) {
|
if (this.background != Oversimplified.emptyImage) {
|
||||||
this.background.onload = function () {
|
this.background.onload = function () {
|
||||||
this.loaded = true;
|
this.loaded = true;
|
||||||
// If extraParameters contains "background size", then make room the size of the background image.
|
// If options "backgroundSize" is set to true, then make room the size of the background image.
|
||||||
if (extraParameters.indexOf("background size") != -1) {
|
if (options.backgroundSize == true) {
|
||||||
self.width = this.width;
|
self.width = this.width;
|
||||||
self.height = this.height;
|
self.height = this.height;
|
||||||
}
|
}
|
||||||
|
@ -448,34 +447,20 @@ Oversimplified.Room = function (name, width, height, backgroundSrc, stepSpeed, e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
this.stepSpeed = stepSpeed;
|
this.stepSpeed = options.stepSpeed;
|
||||||
|
|
||||||
this.objects = {};
|
this.objects = {};
|
||||||
this.O = this.objects;
|
this.O = this.objects;
|
||||||
|
|
||||||
if (extraParameters.length > 0) {
|
if (typeof options.backgroundColor !== 'undefined') {
|
||||||
for (var p = 0; p < extraParameters.length; p++) {
|
self.background.color = options.backgroundColor;
|
||||||
switch (typeof extraParameters[p]) {
|
}
|
||||||
case "string":
|
if (typeof options.foreground !== 'undefined') {
|
||||||
// If the parameter starts with #, then it is a background color hex.
|
|
||||||
if (extraParameters[p].substring(0,1) == "#") {
|
|
||||||
self.background.color = extraParameters[p];
|
|
||||||
} else {
|
|
||||||
var ext = extraParameters[p].substr(extraParameters[p].length - 4);
|
|
||||||
if (ext == ".png" || ext == ".gif") { // If the string is a PNG or GIF, set it as foreground.
|
|
||||||
self.foreground = new Image();
|
self.foreground = new Image();
|
||||||
self.foreground.loaded = false;
|
self.foreground.loaded = false;
|
||||||
self.foreground.src = extraParameters[p];
|
self.foreground.src = options.foreground;
|
||||||
self.foreground.onload = function () {this.loaded = true;}
|
self.foreground.onload = function () {this.loaded = true;}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
|
||||||
// Can be expanded later.
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.drawOrder = [];
|
this.drawOrder = [];
|
||||||
|
|
||||||
|
@ -543,7 +528,7 @@ Oversimplified.Room.prototype.End = function () {
|
||||||
Oversimplified.Room.prototype.Draw = function () {
|
Oversimplified.Room.prototype.Draw = function () {
|
||||||
var self = this;
|
var self = this;
|
||||||
//Always draw background first if there is one
|
//Always draw background first if there is one
|
||||||
if (typeof this.background.color !== "undefined") {
|
if (typeof this.background.color !== 'undefined') {
|
||||||
var tmp = Oversimplified.context.fillStyle;
|
var tmp = Oversimplified.context.fillStyle;
|
||||||
Oversimplified.context.fillStyle = this.background.color;
|
Oversimplified.context.fillStyle = this.background.color;
|
||||||
Oversimplified.context.fillRect(0, 0, Oversimplified.camera.width, Oversimplified.camera.height);
|
Oversimplified.context.fillRect(0, 0, Oversimplified.camera.width, Oversimplified.camera.height);
|
||||||
|
@ -564,7 +549,7 @@ Oversimplified.Room.prototype.Draw = function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is a foreground, draw it.
|
// If there is a foreground, draw it.
|
||||||
if (typeof this.foreground !== "undefined") {
|
if (typeof this.foreground !== 'undefined') {
|
||||||
if (this.foreground.loaded) {
|
if (this.foreground.loaded) {
|
||||||
Oversimplified.context.drawImage(self.foreground, Oversimplified.camera.x, Oversimplified.camera.y, Oversimplified.camera.width, Oversimplified.camera.height, 0, 0, self.foreground.width, self.foreground.height);
|
Oversimplified.context.drawImage(self.foreground, Oversimplified.camera.x, Oversimplified.camera.y, Oversimplified.camera.width, Oversimplified.camera.height, 0, 0, self.foreground.width, self.foreground.height);
|
||||||
}
|
}
|
||||||
|
@ -613,9 +598,9 @@ Oversimplified.SetRoom = function (room) {
|
||||||
Oversimplified.PremadeObjects = {};
|
Oversimplified.PremadeObjects = {};
|
||||||
|
|
||||||
// Add a GameObject to the list of PremadeObjects.
|
// Add a GameObject to the list of PremadeObjects.
|
||||||
Oversimplified.PremadeObjects.Add = function (name, x, y, imageSrc, maskImageSrc, animationsArray) {
|
Oversimplified.PremadeObjects.Add = function (name, objectOptions) {// x, y, imageSrc, maskImageSrc, animationsArray) {
|
||||||
if (typeof Oversimplified.PremadeObjects[name] === 'undefined') {
|
if (typeof Oversimplified.PremadeObjects[name] === 'undefined') {
|
||||||
Oversimplified.PremadeObjects[name] = new Oversimplified.GameObject(name, x, y, imageSrc, maskImageSrc, animationsArray);
|
Oversimplified.PremadeObjects[name] = new Oversimplified.GameObject(name, objectOptions);// x, y, imageSrc, maskImageSrc, animationsArray);
|
||||||
return Oversimplified.PremadeObjects[name];
|
return Oversimplified.PremadeObjects[name];
|
||||||
} else {
|
} else {
|
||||||
if (Oversimplified.DEBUG.showMessages) console.log("A Premade Object with the name \"" + name + "\" already exists!");
|
if (Oversimplified.DEBUG.showMessages) console.log("A Premade Object with the name \"" + name + "\" already exists!");
|
||||||
|
@ -631,59 +616,61 @@ Oversimplified.Prefabs = Oversimplified.PremadeObjects; // In case someone li
|
||||||
Oversimplified.P = Oversimplified.PremadeObjects;
|
Oversimplified.P = Oversimplified.PremadeObjects;
|
||||||
|
|
||||||
// GameObject class
|
// GameObject class
|
||||||
Oversimplified.GameObject = function (name, x, y, imageSrc, maskImageSrc, animationsArray) {
|
Oversimplified.GameObject = function (name, options) {// x, y, imageSrc, maskImageSrc, animationsArray) {
|
||||||
this.id = Oversimplified.nextID++;
|
this.id = Oversimplified.nextID++;
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
this.self = self;
|
this.self = self;
|
||||||
|
|
||||||
|
//Required Options
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.depth = 0;
|
|
||||||
this.solid = false;
|
|
||||||
this.persistent = false;
|
|
||||||
|
|
||||||
this.x = typeof x !== 'undefined' ? x : -1;
|
//Optional Options
|
||||||
this.y = typeof y !== 'undefined' ? y : -1;
|
this.depth = typeof options.depth !== 'undefined' ? options.depth : 0;
|
||||||
|
this.solid = typeof options.solid !== 'undefined' ? options.solid : false;
|
||||||
|
this.persistent = typeof options.persistent !== 'undefined' ? options.persistent : false;
|
||||||
|
this.x = typeof options.x !== 'undefined' ? options.x : -1;
|
||||||
|
this.y = typeof options.y !== 'undefined' ? options.y : -1;
|
||||||
this.xPrevious = this.x;
|
this.xPrevious = this.x;
|
||||||
this.yPrevious = this.y;
|
this.yPrevious = this.y;
|
||||||
this.screenX = this.x - Oversimplified.camera.x;
|
this.screenX = this.x - Oversimplified.camera.x;
|
||||||
this.screenY = this.y - Oversimplified.camera.y;
|
this.screenY = this.y - Oversimplified.camera.y;
|
||||||
|
|
||||||
if (typeof imageSrc !== 'undefined' && imageSrc != "") {
|
if (typeof options.imageSrc !== 'undefined' && options.imageSrc != "") {
|
||||||
this.image = new Image();
|
this.image = new Image();
|
||||||
this.image.src = imageSrc;
|
this.image.src = options.imageSrc;
|
||||||
} else {
|
} else {
|
||||||
this.image = Oversimplified.emptyImage;
|
this.image = Oversimplified.emptyImage;
|
||||||
}
|
}
|
||||||
this.image.xScale = 1;
|
this.image.xScale = typeof options.xScale !== 'undefined' ? options.xScale : 1;
|
||||||
this.image.yScale = 1;
|
this.image.yScale = typeof options.yScale !== 'undefined' ? options.yScale : 1;
|
||||||
this.image.rotation = 0;
|
this.image.rotation = typeof options.rotation !== 'undefined' ? options.rotation : 0;
|
||||||
|
|
||||||
this.image.animations = {};
|
this.image.animations = {};
|
||||||
|
|
||||||
this.image.frameColumn = 0;
|
this.image.frameColumn = 0;
|
||||||
this.image.frameRow = 0;
|
this.image.frameRow = 0;
|
||||||
|
|
||||||
if (typeof animationsArray !== 'undefined') {
|
if (typeof options.animations !== 'undefined') {
|
||||||
for (var i = 0; i < animationsArray.length; i++) {
|
for (var i = 0; i < options.animations.length; i++) {
|
||||||
if (i == 0 && animationsArray[i].name != "Default") {
|
if (i == 0 && options.animations[i].name != "Default") {
|
||||||
this.image.animations["Default"] = animationsArray[i]; // Creates a duplicate animation of the first animation called "Default" in addition to the named animation below (unless the animation's name is "Default")
|
this.image.animations["Default"] = options.animations[i]; // Creates a duplicate animation of the first animation called "Default" in addition to the named animation below (unless the animation's name is "Default")
|
||||||
}
|
}
|
||||||
this.image.animations[animationsArray[i].name] = animationsArray[i];
|
this.image.animations[options.animations[i].name] = options.animations[i];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (this.image != Oversimplified.emptyImage) {
|
if (this.image != Oversimplified.emptyImage) {
|
||||||
//If no animations array is included, then just show the whole image
|
//If no animations array is included, then just show the whole image
|
||||||
this.image.onload = function(){this.animations["Default"] = new Oversimplified.Animation("newAnimation", this.width, this.height)}; // Creates the default animation as the whole image once the image is loaded.
|
this.image.onload = function(){this.animations["Default"] = new Oversimplified.Animation("newAnimation", {width: this.width, height: this.height});} // Creates the default animation as the whole image once the image is loaded.
|
||||||
} else {
|
} else {
|
||||||
this.image.animations["Default"] = new Oversimplified.Animation("newAnimation", this.image.width, this.image.height)
|
this.image.animations["Default"] = new Oversimplified.Animation("newAnimation", {width: this.image.width, height: this.image.height});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.image.currentAnimation = "Default";
|
this.image.currentAnimation = "Default";
|
||||||
|
|
||||||
this.mask = (maskImageSrc) ? new Image() : {};
|
this.mask = (options.maskImageSrc) ? new Image() : {};
|
||||||
this.mask.src = (maskImageSrc) ? maskImageSrc : "";
|
this.mask.src = (options.maskImageSrc) ? options.maskImageSrc : "";
|
||||||
if (this.mask.src == "") {
|
if (this.mask.src == "") {
|
||||||
this.mask.width = this.image.animations["Default"].width;
|
this.mask.width = this.image.animations["Default"].width;
|
||||||
this.mask.height = this.image.animations["Default"].height;
|
this.mask.height = this.image.animations["Default"].height;
|
||||||
|
@ -711,13 +698,13 @@ Oversimplified.GameObject = function (name, x, y, imageSrc, maskImageSrc, animat
|
||||||
this.DrawAbove = function () {};
|
this.DrawAbove = function () {};
|
||||||
}
|
}
|
||||||
Oversimplified.GameObject.prototype.type = "GameObject";
|
Oversimplified.GameObject.prototype.type = "GameObject";
|
||||||
Oversimplified.GameObject.prototype.AddAnimation = function (animation, width, height, columns, rows, speed, xOffset, yOffset) {
|
Oversimplified.GameObject.prototype.AddAnimation = function (animation, animationWidth, animationHeight, animationOptions) {//columns, rows, speed, xOffset, yOffset) {
|
||||||
//Takes either an animation or the name of an animation in the Animations namespace and adds it to the object.
|
//Takes either an animation or the name of an animation in the Animations namespace and adds it to the object.
|
||||||
if (animation.name) {
|
if (typeof animation.name !== 'undefined') {
|
||||||
this.image.animations[animation.name] = animation;
|
this.image.animations[animationOptions.name] = animation;
|
||||||
} else {
|
} else {
|
||||||
if (typeof Oversimplified.Animations[animation] === 'undefined') {
|
if (typeof Oversimplified.Animations[animation] === 'undefined') {
|
||||||
Oversimplified.Animations.Add(animation, width, height, columns, rows, speed, xOffset, yOffset);
|
Oversimplified.Animations.Add(animation, animationWidth, animationHeight, animationOptions);
|
||||||
}
|
}
|
||||||
this.image.animations[Oversimplified.Animations[animation].name] = Oversimplified.Animations[animation];
|
this.image.animations[Oversimplified.Animations[animation].name] = Oversimplified.Animations[animation];
|
||||||
}
|
}
|
||||||
|
@ -1013,12 +1000,12 @@ Oversimplified.CollisionAtPoint = function (x, y) {
|
||||||
|
|
||||||
// Animations Namespace
|
// Animations Namespace
|
||||||
Oversimplified.Animations = {};
|
Oversimplified.Animations = {};
|
||||||
Oversimplified.Animations.Add = function (name, width, height, columns, rows, speed, xOffset, yOffset) {
|
Oversimplified.Animations.Add = function (animationName, animationWidth, animationHeight, animationOptions) {
|
||||||
if (typeof Oversimplified.Animations[name] === 'undefined') {
|
if (typeof Oversimplified.Animations[animationName] === 'undefined') {
|
||||||
Oversimplified.Animations[name] = new Oversimplified.Animation(name, width, height, columns, rows, speed, xOffset, yOffset);
|
Oversimplified.Animations[animationName] = new Oversimplified.Animation(animationName, animationWidth, animationHeight, animationOptions);
|
||||||
return Oversimplified.Animations[name];
|
return Oversimplified.Animations[animationName];
|
||||||
} else {
|
} else {
|
||||||
if (Oversimplified.DEBUG.showMessages) console.log("An animation with the name \"" + name + "\" already exists!");
|
if (Oversimplified.DEBUG.showMessages) console.log("An animation with the name \"" + animationName + "\" already exists!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1028,25 +1015,27 @@ Oversimplified.A = Oversimplified.Animations;
|
||||||
// Animation class (for use with sprite sheets)
|
// Animation class (for use with sprite sheets)
|
||||||
//
|
//
|
||||||
// Prevents animation mess-ups by preventing speeds higher than one with Math.clamp01.
|
// Prevents animation mess-ups by preventing speeds higher than one with Math.clamp01.
|
||||||
Oversimplified.Animation = function (name, width, height, columns, rows, speed, xOffset, yOffset) {
|
Oversimplified.Animation = function (name, width, height, options) {
|
||||||
this.id = Oversimplified.nextID++;
|
this.id = Oversimplified.nextID++;
|
||||||
|
|
||||||
columns = typeof columns !== 'undefined' ? columns : 1;
|
//Required Options
|
||||||
rows = typeof rows !== 'undefined' ? rows : 1;
|
|
||||||
speed = typeof speed !== 'undefined' ? speed : 1;
|
|
||||||
xOffset = typeof xOffset !== 'undefined' ? xOffset : 0;
|
|
||||||
yOffset = typeof yOffset !== 'undefined' ? yOffset : 0;
|
|
||||||
|
|
||||||
speed = Math.clamp01(speed);
|
|
||||||
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.width = width;
|
this.width = width;
|
||||||
this.height = height;
|
this.height = height;
|
||||||
this.columns = columns;
|
|
||||||
this.rows = rows;
|
//Optional Options
|
||||||
this.xOffset = xOffset;
|
options.columns = typeof options.columns !== 'undefined' ? options.columns : 1;
|
||||||
this.yOffset = yOffset;
|
options.rows = typeof options.rows !== 'undefined' ? options.rows : 1;
|
||||||
this.speed = speed;
|
options.speed = typeof options.speed !== 'undefined' ? Math.clamp01(options.speed) : 1;
|
||||||
|
options.xOffset = typeof options.xOffset !== 'undefined' ? options.xOffset : 0;
|
||||||
|
options.yOffset = typeof options.yOffset !== 'undefined' ? options.yOffset : 0;
|
||||||
|
|
||||||
|
|
||||||
|
this.columns = options.columns;
|
||||||
|
this.rows = options.rows;
|
||||||
|
this.speed = options.speed;
|
||||||
|
this.xOffset = options.xOffset;
|
||||||
|
this.yOffset = options.yOffset;
|
||||||
}
|
}
|
||||||
Oversimplified.Animation.prototype.type = "Animation";
|
Oversimplified.Animation.prototype.type = "Animation";
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue